Update antiword (thanks to Steve Simon). [jmk] --rw-rw-r-- M 499692 jmk sys 27773 Jan 14 12:57 sys/src/cmd/aux/antiword/antiword.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:1,6 /* * antiword.h - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Generic include file for project 'Antiword' /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:16,26 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:16,27 #include #include #if defined(__riscos) - #include "wimp.h" - #include "drawfobj.h" - #include "font.h" - #include "werr.h" - #include "draw.h" + #include "DeskLib:Font.h" + #include "DeskLib:Wimp.h" + #include "Desklib:Window.h" + #include "drawfile.h" + #define window_ANY event_ANY + #define icon_ANY event_ANY #else #include #endif /* __riscos */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:66,72 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:67,73 #if defined(__riscos) #define FILE_SEPARATOR "." - #elif defined(__dos) + #elif defined(__dos) || defined(__CYGMING__) #define FILE_SEPARATOR "\\" #else /* All others */ #define FILE_SEPARATOR "/" /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:125,132 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:126,135 #define SCALE_100_PCT 7 #define SCALE_150_PCT 8 - /* New draw objects */ - #define draw_OBJJPEG 16 + /* Save menu fields */ + #define SAVEMENU_SCALEVIEW 0 + #define SAVEMENU_SAVEDRAW 1 + #define SAVEMENU_SAVETEXT 2 #else /* Margins for the PostScript version */ #define PS_LEFT_MARGIN (72 * 640L) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:138,148 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:141,151 /* Macros */ #define STREQ(x,y) (*(x) == *(y) && strcmp(x,y) == 0) #define STRNEQ(x,y,n) (*(x) == *(y) && strncmp(x,y,n) == 0) - #if defined(__dos) + #if defined(__dos) || defined(__EMX__) #define STRCEQ(x,y) (stricmp(x,y) == 0) #else #define STRCEQ(x,y) (strcasecmp(x,y) == 0) - #endif /* __dos */ + #endif /* __dos or __EMX__ */ #define elementsof(a) (sizeof(a) / sizeof(a[0])) #define odd(x) (((x)&0x01)!=0) #define ROUND4(x) (((x)+3)&~0x03) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:196,201 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:199,208 #define GLOBAL_ANTIWORD_DIR "SYS:.antiword" #define ANTIWORD_DIR ".antiword" #define FONTNAMES_FILE "fontnames" + #elif defined(N_PLAT_NLM) + #define GLOBAL_ANTIWORD_DIR "SYS:/antiword" + #define ANTIWORD_DIR "antiword" + #define FONTNAMES_FILE "fontname.txt" #elif defined(__vms) #define GLOBAL_ANTIWORD_DIR "/usr/share/antiword" #define ANTIWORD_DIR "antiword" /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:204,222 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:211,252 #define GLOBAL_ANTIWORD_DIR "/boot/home/config/apps/antiword" #define ANTIWORD_DIR "antiword" #define FONTNAMES_FILE "fontnames" + #elif defined(__CYGMING__) + #define GLOBAL_ANTIWORD_DIR "C:\\antiword" + #define ANTIWORD_DIR "antiword" + #define FONTNAMES_FILE "fontnames" #elif defined(__Plan9__) #define GLOBAL_ANTIWORD_DIR "/sys/lib/antiword" #define ANTIWORD_DIR "lib/antiword" #define FONTNAMES_FILE "fontnames" + #elif defined(__sun__) + #define GLOBAL_ANTIWORD_DIR "/usr/local/share/antiword" + #define ANTIWORD_DIR ".antiword" + #define FONTNAMES_FILE "fontnames" #else /* All others */ #define GLOBAL_ANTIWORD_DIR "/usr/share/antiword" #define ANTIWORD_DIR ".antiword" #define FONTNAMES_FILE "fontnames" #endif /* __dos */ - /* The name of the default mapping file */ - #define MAPPING_FILE_DEFAULT_1 "8859-1.txt" - #define MAPPING_FILE_DEFAULT_2 "8859-2.txt" - #define MAPPING_FILE_DEFAULT_8 "UTF-8.txt" + /* The names of grouped mapping files */ + /* ASCII */ + #define MAPPING_FILE_CP437 "cp437.txt" + /* Latin1 */ + #define MAPPING_FILE_8859_1 "8859-1.txt" + /* Latin2 */ + #define MAPPING_FILE_8859_2 "8859-2.txt" + #define MAPPING_FILE_CP852 "cp852.txt" + #define MAPPING_FILE_CP1250 "cp1250.txt" + /* Cyrillic */ + #define MAPPING_FILE_8859_5 "8859-5.txt" + #define MAPPING_FILE_KOI8_R "koi8-r.txt" + #define MAPPING_FILE_KOI8_U "koi8-u.txt" + #define MAPPING_FILE_CP866 "cp866.txt" + #define MAPPING_FILE_CP1251 "cp1251.txt" + /* Latin9 */ + #define MAPPING_FILE_8859_15 "8859-15.txt" + /* UTF-8 */ + #define MAPPING_FILE_UTF_8 "UTF-8.txt" #endif /* __riscos */ /* Prototypes */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:230,246 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:260,282 extern BOOL bAdd2TextBlockList(const text_block_type *); extern void vSplitBlockList(FILE *, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, BOOL); + extern BOOL bExistsHdrFtr(void); extern BOOL bExistsTextBox(void); extern BOOL bExistsHdrTextBox(void); extern USHORT usNextChar(FILE *, list_id_enum, ULONG *, ULONG *, USHORT *); + extern USHORT usToHdrFtrPosition(FILE *, ULONG); + extern USHORT usToFootnotePosition(FILE *, ULONG); + extern ULONG ulCharPos2FileOffsetX(ULONG, list_id_enum *); extern ULONG ulCharPos2FileOffset(ULONG); + extern ULONG ulHdrFtrOffset2CharPos(ULONG); extern ULONG ulGetSeqNumber(ULONG); #if defined(__riscos) extern ULONG ulGetDocumentLength(void); #endif /* __riscos */ /* chartrans.c */ - extern UCHAR ucGetNbspValue(void); - extern BOOL bReadCharacterMappingTable(const char *); + extern UCHAR ucGetBulletCharacter(conversion_type, encoding_type); + extern UCHAR ucGetNbspCharacter(void); + extern BOOL bReadCharacterMappingTable(FILE *); extern ULONG ulTranslateCharacters(USHORT, ULONG, int, conversion_type, encoding_type, BOOL); extern ULONG ulToUpper(ULONG); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:263,280 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:299,324 /* dib2eps & dib2sprt.c */ extern BOOL bTranslateDIB(diagram_type *, FILE *, ULONG, const imagedata_type *); + #if defined(__dos) + /* dos.c */ + extern int iGetCodepage(void); + #endif /* __dos */ + /* doclist.c */ + extern void vDestroyDocumentInfoList(void); + extern void vCreateDocumentInfoList(const document_block_type *); + extern UCHAR ucGetDopHdrFtrSpecification(void); /* draw.c & output.c */ extern BOOL bAddDummyImage(diagram_type *, const imagedata_type *); extern diagram_type *pCreateDiagram(const char *, const char *); extern void vPrologue2(diagram_type *, int); - extern void vMove2NextLine(diagram_type *, draw_fontref, USHORT); + extern void vMove2NextLine(diagram_type *, drawfile_fontref, USHORT); extern void vSubstring2Diagram(diagram_type *, char *, size_t, long, UCHAR, USHORT, - draw_fontref, USHORT, USHORT); + drawfile_fontref, USHORT, USHORT); extern void vStartOfParagraph1(diagram_type *, long); extern void vStartOfParagraph2(diagram_type *); - extern void vEndOfParagraph(diagram_type *, draw_fontref, USHORT, long); - extern void vEndOfPage(diagram_type *, long); + extern void vEndOfParagraph(diagram_type *, drawfile_fontref, USHORT, long); + extern void vEndOfPage(diagram_type *, long, BOOL); extern void vSetHeaders(diagram_type *, USHORT); extern void vStartOfList(diagram_type *, UCHAR, BOOL); extern void vEndOfList(diagram_type *); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:283,296 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:327,346 extern BOOL bAddTableRow(diagram_type *, char **, int, const short *, UCHAR); #if defined(__riscos) + extern BOOL bDestroyDiagram(event_pollblock *, void *); extern void vImage2Diagram(diagram_type *, const imagedata_type *, UCHAR *, size_t); extern BOOL bVerifyDiagram(diagram_type *); extern void vShowDiagram(diagram_type *); - extern void vMainEventHandler(wimp_eventstr *, void *); - extern void vScaleOpenAction(diagram_type *); + extern void vMainButtonClick(mouse_block *); + extern BOOL bMainKeyPressed(event_pollblock *, void *); + extern BOOL bMainEventHandler(event_pollblock *, void *); + extern BOOL bRedrawMainWindow(event_pollblock *, void *); + extern BOOL bScaleOpenAction(event_pollblock *, void *); extern void vSetTitle(diagram_type *); - extern void vScaleEventHandler(wimp_eventstr *, void *); + extern void vScaleButtonClick(mouse_block *, diagram_type *); + extern BOOL bScaleKeyPressed(event_pollblock *, void *); + extern BOOL bScaleEventHandler(event_pollblock *, void *); #else extern void vImagePrologue(diagram_type *, const imagedata_type *); extern void vImageEpilogue(diagram_type *); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:308,313 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:358,367 extern BOOL bGet8DocumentText(FILE *, const pps_info_type *, const ULONG *, size_t, const ULONG *, size_t, const UCHAR *); + /* fmt_text.c */ + extern void vPrologueFMT(diagram_type *, const options_type *); + extern void vSubstringFMT(diagram_type *, const char *, size_t, long, + USHORT); /* fontlist.c */ extern void vDestroyFontInfoList(void); extern void vCorrectFontValues(font_block_type *); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:319,325 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:373,379 extern const char *szGetOurFontname(int); extern int iFontname2Fontnumber(const char *, USHORT); extern void vCreate0FontTable(void); - extern void vCreate2FontTable(FILE *, const UCHAR *); + extern void vCreate2FontTable(FILE *, int, const UCHAR *); extern void vCreate6FontTable(FILE *, ULONG, const ULONG *, size_t, const UCHAR *); extern void vCreate8FontTable(FILE *, const pps_info_type *, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:329,352 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:383,415 extern const font_table_type *pGetNextFontTableRecord( const font_table_type *); extern size_t tGetFontTableLength(void); + extern void vCorrectFontTable(conversion_type, encoding_type); + extern long lComputeSpaceWidth(drawfile_fontref, USHORT); /* fonts_r.c & fonts_u.c */ extern FILE *pOpenFontTableFile(void); extern void vCloseFont(void); - extern draw_fontref tOpenFont(UCHAR, USHORT, USHORT); - extern draw_fontref tOpenTableFont(USHORT); - extern long lComputeStringWidth(const char *, size_t, draw_fontref, USHORT); + extern drawfile_fontref tOpenFont(UCHAR, USHORT, USHORT); + extern drawfile_fontref tOpenTableFont(USHORT); + extern long lComputeStringWidth(const char *, size_t, drawfile_fontref, USHORT); extern size_t tCountColumns(const char *, size_t); extern size_t tGetCharacterLength(const char *); /* fonts_u.c */ #if !defined(__riscos) - extern const char *szGetFontname(draw_fontref); + extern const char *szGetFontname(drawfile_fontref); #endif /* !__riscos */ + /* hdrftrlist.c */ + extern void vDestroyHdrFtrInfoList(void); + extern void vCreat8HdrFtrInfoList(const ULONG *, size_t); + extern void vCreat6HdrFtrInfoList(const ULONG *, size_t); + extern void vCreat2HdrFtrInfoList(const ULONG *, size_t); + extern const hdrftr_block_type *pGetHdrFtrInfo(int, BOOL, BOOL, BOOL); + extern void vPrepareHdrFtrText(FILE *); #if defined(__riscos) /* icons.c */ - extern void vUpdateIcon(wimp_w, wimp_icon *); - extern void vUpdateRadioButton(wimp_w, wimp_i, BOOL); - extern void vUpdateWriteable(wimp_w, wimp_i, char *); - extern void vUpdateWriteableNumber(wimp_w, wimp_i, int); + extern void vUpdateIcon(window_handle, icon_block *); + extern void vUpdateRadioButton(window_handle, icon_handle, BOOL); + extern void vUpdateWriteable(window_handle, icon_handle, const char *); + extern void vUpdateWriteableNumber(window_handle, icon_handle, int); #endif /* __riscos */ /* imgexam.c */ extern image_info_enum eExamineImage(FILE *, ULONG, imagedata_type *); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:388,406 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:451,474 extern size_t tUcs2Utf8(ULONG, char *, size_t); extern void vGetBulletValue(conversion_type, encoding_type, char *, size_t); extern BOOL bAllZero(const UCHAR *, size_t); + extern BOOL bGetNormalizedCodeset(char *, size_t, BOOL *); + extern const char *szGetDefaultMappingFile(void); + extern time_t tConvertDTTM(ULONG); /* notes.c */ extern void vDestroyNotesInfoLists(void); extern void vGetNotesInfo(FILE *, const pps_info_type *, const ULONG *, size_t, const ULONG *, size_t, const UCHAR *, int); + extern void vPrepareFootnoteText(FILE *); + extern const char *szGetFootnootText(UINT); extern notetype_enum eGetNotetype(ULONG); /* options.c */ extern int iReadOptions(int, char **); extern void vGetOptions(options_type *); #if defined(__riscos) - extern void vChoicesOpenAction(wimp_w); - extern void vChoicesMouseClick(wimp_mousestr *); - extern void vChoicesKeyPressed(wimp_caretstr *); + extern void vChoicesOpenAction(window_handle); + extern BOOL bChoicesMouseClick(event_pollblock *, void *); + extern BOOL bChoicesKeyPressed(event_pollblock *, void *); #endif /* __riscos */ /* out2window.c */ extern void vSetLeftIndentation(diagram_type *, long); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:409,418 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:477,502 extern void vJustify2Window(diagram_type *, output_type *, long, long, UCHAR); extern void vResetStyles(void); - extern size_t tStyle2Window(char *, const style_block_type *, + extern size_t tStyle2Window(char *, size_t, const style_block_type *, const section_block_type *); - extern void vTableRow2Window(diagram_type *, - output_type *, const row_block_type *); + extern void vTableRow2Window(diagram_type *, output_type *, + const row_block_type *, conversion_type, int); + /* pdf.c */ + extern void vCreateInfoDictionary(diagram_type *, int); + extern void vProloguePDF(diagram_type *, + const char *, const options_type *); + extern void vEpiloguePDF(diagram_type *); + extern void vImageProloguePDF(diagram_type *, const imagedata_type *); + extern void vImageEpiloguePDF(diagram_type *); + extern BOOL bAddDummyImagePDF(diagram_type *, const imagedata_type *); + extern void vAddFontsPDF(diagram_type *); + extern void vMove2NextLinePDF(diagram_type *, USHORT); + extern void vSubstringPDF(diagram_type *, + char *, size_t, long, UCHAR, USHORT, + drawfile_fontref, USHORT, USHORT); + extern void vStartOfParagraphPDF(diagram_type *, long); + extern void vEndOfParagraphPDF(diagram_type *, USHORT, long); + extern void vEndOfPagePDF(diagram_type *, BOOL); /* pictlist.c */ extern void vDestroyPictInfoList(void); extern void vAdd2PictInfoList(const picture_block_type *); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:431,446 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:515,533 extern void vMove2NextLinePS(diagram_type *, USHORT); extern void vSubstringPS(diagram_type *, char *, size_t, long, UCHAR, USHORT, - draw_fontref, USHORT, USHORT); + drawfile_fontref, USHORT, USHORT); extern void vStartOfParagraphPS(diagram_type *, long); - extern void vEndOfParagraphPS(diagram_type *, draw_fontref, USHORT, long); - extern void vEndOfPagePS(diagram_type *); + extern void vEndOfParagraphPS(diagram_type *, USHORT, long); + extern void vEndOfPagePS(diagram_type *, BOOL); /* prop0.c */ + extern void vGet0DopInfo(FILE *, const UCHAR *); extern void vGet0SepInfo(FILE *, const UCHAR *); extern void vGet0PapInfo(FILE *, const UCHAR *); extern void vGet0ChrInfo(FILE *, const UCHAR *); /* prop2.c */ + extern void vGet2DopInfo(FILE *, const UCHAR *); extern void vGet2SepInfo(FILE *, const UCHAR *); + extern void vGet2HdrFtrInfo(FILE *, const UCHAR *); extern row_info_enum eGet2RowInfo(int, const UCHAR *, int, row_block_type *); extern void vGet2StyleInfo(int, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:452,459 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:539,550 const UCHAR *, size_t, font_block_type *); extern void vGet2ChrInfo(FILE *, int, const UCHAR *); /* prop6.c */ + extern void vGet6DopInfo(FILE *, ULONG, const ULONG *, size_t, + const UCHAR *); extern void vGet6SepInfo(FILE *, ULONG, const ULONG *, size_t, const UCHAR *); + extern void vGet6HdrFtrInfo(FILE *, ULONG, const ULONG *, size_t, + const UCHAR *); extern row_info_enum eGet6RowInfo(int, const UCHAR *, int, row_block_type *); extern void vGet6StyleInfo(int, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:465,473 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:556,570 extern void vGet6ChrInfo(FILE *, ULONG, const ULONG *, size_t, const UCHAR *); /* prop8.c */ + extern void vGet8DopInfo(FILE *, const pps_type *, + const ULONG *, size_t, const ULONG *, size_t, + const UCHAR *); extern void vGet8SepInfo(FILE *, const pps_info_type *, const ULONG *, size_t, const ULONG *, size_t, const UCHAR *); + extern void vGet8HdrFtrInfo(FILE *, const pps_type *, + const ULONG *, size_t, const ULONG *, size_t, + const UCHAR *); extern row_info_enum eGet8RowInfo(int, const UCHAR *, int, row_block_type *); extern void vGet8StyleInfo(int, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:503,510 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:600,607 extern BOOL bMakeDirectory(const char *); extern int iReadCurrentAlphabetNumber(void); extern int iGetRiscOsVersion(void); - extern BOOL bDrawRenderDiag360(draw_diag *, - draw_redrawstr *, double, draw_error *); + extern BOOL bDrawRenderDiag360(void *, size_t, + window_redrawblock *, double, os_error *); #if defined(DEBUG) extern BOOL bGetJpegInfo(UCHAR *, size_t); #endif /* DEBUG */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:511,518 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:608,615 #endif /* __riscos */ /* saveas.c */ #if defined(__riscos) - extern void vSaveTextfile(diagram_type *); - extern void vSaveDrawfile(diagram_type *); + extern BOOL bSaveTextfile(event_pollblock *, void *); + extern BOOL bSaveDrawfile(event_pollblock *, void *); #endif /* __riscos */ /* sectlist.c */ extern void vDestroySectionInfoList(void); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:521,526 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:618,625 extern void vDefault2SectionInfoList(ULONG); extern const section_block_type * pGetSectionInfo(const section_block_type *, ULONG); + extern size_t tGetNumberOfSections(void); + extern UCHAR ucGetSepHdrFtrSpecification(size_t); /* stylelist.c */ extern void vDestroyStyleInfoList(void); extern level_type_enum eGetNumType(UCHAR); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:528,533 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:627,633 extern void vAdd2StyleInfoList(const style_block_type *); extern const style_block_type *pGetNextStyleInfoListItem( const style_block_type *); + extern const style_block_type *pGetNextTextStyle(const style_block_type *); extern USHORT usGetIstd(ULONG); extern BOOL bStyleImpliesList(const style_block_type *, int); /* stylesheet.c */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:555,560 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:655,662 extern const char *szGetSubject(void); extern const char *szGetAuthor(void); extern const char *szGetLastSaveDtm(void); + extern const char *szGetModDate(void); + extern const char *szGetCreationDate(void); extern const char *szGetCompany(void); extern const char *szGetLanguage(void); /* tabstop.c */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:571,580 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:673,682 extern void vEndOfParagraphTXT(diagram_type *, long); extern void vEndOfPageTXT(diagram_type *, long); /* unix.c */ - #if !defined(__riscos) extern void werr(int, const char *, ...); - extern void visdelay_begin(void); - extern void visdelay_end(void); + #if !defined(__riscos) + extern void Hourglass_On(void); + extern void Hourglass_Off(void); #endif /* !__riscos */ /* utf8.c */ #if !defined(__riscos) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:583,589 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:685,694 extern BOOL is_locale_utf8(void); #endif /* !__riscos */ /* word2text.c */ + extern BOOL bOutputContainsText(const output_type *); extern BOOL bWordDecryptor(FILE *, long, diagram_type *); + extern output_type *pHdrFtrDecryptor(FILE *, ULONG, ULONG); + extern char *szFootnoteDecryptor(FILE *, ULONG, ULONG); /* worddos.c */ extern int iInitDocumentDOS(FILE *, long); /* wordlib.c */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:610,623 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:715,728 extern char *xstrdup(const char *); extern void *xfree(void *); /* xml.c */ - extern void vCreateBookIntro(diagram_type *, int, encoding_type); - extern void vPrologueXML(diagram_type *); + extern void vCreateBookIntro(diagram_type *, int); + extern void vPrologueXML(diagram_type *, const options_type *); extern void vEpilogueXML(diagram_type *); extern void vMove2NextLineXML(diagram_type *); extern void vSubstringXML(diagram_type *, const char *, size_t, long, USHORT); - extern void vStartOfParagraphXML(diagram_type *, int); - extern void vEndOfParagraphXML(diagram_type *, int); + extern void vStartOfParagraphXML(diagram_type *, UINT); + extern void vEndOfParagraphXML(diagram_type *, UINT); extern void vEndOfPageXML(diagram_type *); extern void vSetHeadersXML(diagram_type *, USHORT); extern void vStartOfListXML(diagram_type *, UCHAR, BOOL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/antiword.h:626,638 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/antiword.h:731,735 extern void vEndOfTableXML(diagram_type *); extern void vAddTableRowXML(diagram_type *, char **, int, const short *, UCHAR); - - - /* For use with Gray Watson dmalloc library */ - #if defined(DMALLOC) - #include "dmalloc.h" - /* The xfree in Antiword is incompatible with the one in dmalloc */ - #undef xfree - #endif /* DMALLOC */ #endif /* __antiword_h */ [jmk] --rw-rw-r-- M 499692 jmk sys 27773 Jan 14 12:57 sys/src/cmd/aux/antiword/antiword.h [jmk] --rw-rw-r-- M 499692 jmk sys 3910 Jan 14 12:57 sys/src/cmd/aux/antiword/asc85enc.c [jmk] --rw-rw-r-- M 499692 jmk sys 3910 Jan 14 12:57 sys/src/cmd/aux/antiword/asc85enc.c [jmk] --rw-rw-r-- M 499692 jmk sys 22483 Jan 14 12:57 sys/src/cmd/aux/antiword/blocklist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:1,6 /* * blocklist.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy the lists of Word "text" blocks /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:19,39 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:19,46 struct list_mem_tag *pNext; } list_mem_type; + typedef struct readinfo_tag { + list_mem_type *pBlockCurrent; + ULONG ulBlockOffset; + size_t tByteNext; + UCHAR aucBlock[BIG_BLOCK_SIZE]; + } readinfo_type; + /* Variables to describe the start of the block lists */ static list_mem_type *pTextAnchor = NULL; - static list_mem_type *pFootAnchor = NULL; + static list_mem_type *pFootnoteAnchor = NULL; static list_mem_type *pHdrFtrAnchor = NULL; static list_mem_type *pMacroAnchor = NULL; static list_mem_type *pAnnotationAnchor = NULL; - static list_mem_type *pEndAnchor = NULL; + static list_mem_type *pEndnoteAnchor = NULL; static list_mem_type *pTextBoxAnchor = NULL; static list_mem_type *pHdrTextBoxAnchor = NULL; /* Variable needed to build the block list */ static list_mem_type *pBlockLast = NULL; - /* Variable needed to read a block list */ - static list_mem_type *pBlockCurrent = NULL; - /* Last block read */ - static UCHAR aucBlock[BIG_BLOCK_SIZE]; + /* Variable needed to read the block lists */ + static readinfo_type tOthers = { NULL, 0, 0, }; + static readinfo_type tHdrFtr = { NULL, 0, 0, }; + static readinfo_type tFootnote = { NULL, 0, 0, }; /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:65,80 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:72,89 /* Free the lists one by one */ pTextAnchor = pFreeOneList(pTextAnchor); - pFootAnchor = pFreeOneList(pFootAnchor); + pFootnoteAnchor = pFreeOneList(pFootnoteAnchor); pHdrFtrAnchor = pFreeOneList(pHdrFtrAnchor); pMacroAnchor = pFreeOneList(pMacroAnchor); pAnnotationAnchor = pFreeOneList(pAnnotationAnchor); - pEndAnchor = pFreeOneList(pEndAnchor); + pEndnoteAnchor = pFreeOneList(pEndnoteAnchor); pTextBoxAnchor = pFreeOneList(pTextBoxAnchor); pHdrTextBoxAnchor = pFreeOneList(pHdrTextBoxAnchor); /* Reset all the controle variables */ pBlockLast = NULL; - pBlockCurrent = NULL; + tOthers.pBlockCurrent = NULL; + tHdrFtr.pBlockCurrent = NULL; + tFootnote.pBlockCurrent = NULL; } /* end of vDestroyTextBlockList */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:283,293 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:292,303 for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { fail(pCurr->tInfo.ulLength == 0); tSize = (size_t)pCurr->tInfo.ulLength; - #if defined(__dos) + #if defined(__dos) && !defined(__DJGPP__) if (pCurr->tInfo.ulLength > 0xffffUL) { tSize = 0xffff; } - #endif /* __dos */ + #endif /* __dos && !__DJGPP__ */ + fail(aucBuffer != NULL); aucBuffer = xmalloc(tSize); if (!bReadBytes(aucBuffer, tSize, pCurr->tInfo.ulFileOffset, pFile)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:306,313 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:316,324 return FALSE; } } + aucBuffer = xfree(aucBuffer); } - aucBuffer = xfree(aucBuffer); + fail(aucBuffer != NULL); return TRUE; } /* end of bIsEmptyBox */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:337,353 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:348,364 pGarbageAnchor = NULL; DBG_MSG_C(ulTextLen != 0, "Text block list"); - vSpitList(&pTextAnchor, &pFootAnchor, ulTextLen); + vSpitList(&pTextAnchor, &pFootnoteAnchor, ulTextLen); DBG_MSG_C(ulFootnoteLen != 0, "Footnote block list"); - vSpitList(&pFootAnchor, &pHdrFtrAnchor, ulFootnoteLen); + vSpitList(&pFootnoteAnchor, &pHdrFtrAnchor, ulFootnoteLen); DBG_MSG_C(ulHdrFtrLen != 0, "Header/Footer block list"); vSpitList(&pHdrFtrAnchor, &pMacroAnchor, ulHdrFtrLen); DBG_MSG_C(ulMacroLen != 0, "Macro block list"); vSpitList(&pMacroAnchor, &pAnnotationAnchor, ulMacroLen); DBG_MSG_C(ulAnnotationLen != 0, "Annotation block list"); - vSpitList(&pAnnotationAnchor, &pEndAnchor, ulAnnotationLen); + vSpitList(&pAnnotationAnchor, &pEndnoteAnchor, ulAnnotationLen); DBG_MSG_C(ulEndnoteLen != 0, "Endnote block list"); - vSpitList(&pEndAnchor, &pTextBoxAnchor, ulEndnoteLen); + vSpitList(&pEndnoteAnchor, &pTextBoxAnchor, ulEndnoteLen); DBG_MSG_C(ulTextBoxLen != 0, "Textbox block list"); vSpitList(&pTextBoxAnchor, &pHdrTextBoxAnchor, ulTextBoxLen); DBG_MSG_C(ulHdrTextBoxLen != 0, "HeaderTextbox block list"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:359,370 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:370,381 #if defined(DEBUG) vCheckList(pTextAnchor, ulTextLen, "Software error (Text)"); - vCheckList(pFootAnchor, ulFootnoteLen, "Software error (Footnote)"); + vCheckList(pFootnoteAnchor, ulFootnoteLen, "Software error (Footnote)"); vCheckList(pHdrFtrAnchor, ulHdrFtrLen, "Software error (Hdr/Ftr)"); vCheckList(pMacroAnchor, ulMacroLen, "Software error (Macro)"); vCheckList(pAnnotationAnchor, ulAnnotationLen, "Software error (Annotation)"); - vCheckList(pEndAnchor, ulEndnoteLen, "Software error (Endnote)"); + vCheckList(pEndnoteAnchor, ulEndnoteLen, "Software error (Endnote)"); vCheckList(pTextBoxAnchor, ulTextBoxLen, "Software error (TextBox)"); vCheckList(pHdrTextBoxAnchor, ulHdrTextBoxLen, "Software error (HdrTextBox)"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:387,397 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:398,408 */ apAnchors[0] = pTextAnchor; - apAnchors[1] = pFootAnchor; + apAnchors[1] = pFootnoteAnchor; apAnchors[2] = pHdrFtrAnchor; apAnchors[3] = pMacroAnchor; apAnchors[4] = pAnnotationAnchor; - apAnchors[5] = pEndAnchor; + apAnchors[5] = pEndnoteAnchor; apAnchors[6] = pTextBoxAnchor; apAnchors[7] = pHdrTextBoxAnchor; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:428,435 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:439,446 DBG_MSG("ulGetDocumentLength"); ulTotal = ulComputeListLength(pTextAnchor); - ulTotal += ulComputeListLength(pFootAnchor); - ulTotal += ulComputeListLength(pEndAnchor); + ulTotal += ulComputeListLength(pFootnoteAnchor); + ulTotal += ulComputeListLength(pEndnoteAnchor); ulTotal += ulComputeListLength(pTextBoxAnchor); ulTotal += ulComputeListLength(pHdrTextBoxAnchor); DBG_DEC(ulTotal); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:437,443 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:448,466 } /* end of ulGetDocumentLength */ #endif /* __riscos */ + #if 0 /* + * bExistsHdrFtr - are there headers and/or footers? + */ + BOOL + bExistsHdrFtr(void) + { + return pHdrFtrAnchor != NULL && + pHdrFtrAnchor->tInfo.ulLength != 0; + } /* end of bExistsHdrFtr */ + #endif + + /* * bExistsTextBox - is there a text box? */ BOOL /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:456,538 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:479,607 return pHdrTextBoxAnchor != NULL && pHdrTextBoxAnchor->tInfo.ulLength != 0; } /* end of bExistsHdrTextBox */ + /* * usGetNextByte - get the next byte from the specified block list */ static USHORT - usGetNextByte(FILE *pFile, list_mem_type *pAnchor, + usGetNextByte(FILE *pFile, readinfo_type *pInfoCurrent, list_mem_type *pAnchor, ULONG *pulFileOffset, ULONG *pulCharPos, USHORT *pusPropMod) { - static ULONG ulBlockOffset = 0; - static size_t tByteNext = 0; ULONG ulReadOff; size_t tReadLen; - if (pBlockCurrent == NULL || - tByteNext >= sizeof(aucBlock) || - ulBlockOffset + tByteNext >= pBlockCurrent->tInfo.ulLength) { - if (pBlockCurrent == NULL) { + fail(pInfoCurrent == NULL); + + if (pInfoCurrent->pBlockCurrent == NULL || + pInfoCurrent->tByteNext >= sizeof(pInfoCurrent->aucBlock) || + pInfoCurrent->ulBlockOffset + pInfoCurrent->tByteNext >= + pInfoCurrent->pBlockCurrent->tInfo.ulLength) { + if (pInfoCurrent->pBlockCurrent == NULL) { /* First block, first part */ - pBlockCurrent = pAnchor; - ulBlockOffset = 0; - } else if (ulBlockOffset + sizeof(aucBlock) < - pBlockCurrent->tInfo.ulLength) { + pInfoCurrent->pBlockCurrent = pAnchor; + pInfoCurrent->ulBlockOffset = 0; + } else if (pInfoCurrent->ulBlockOffset + + sizeof(pInfoCurrent->aucBlock) < + pInfoCurrent->pBlockCurrent->tInfo.ulLength) { /* Same block, next part */ - ulBlockOffset += sizeof(aucBlock); + pInfoCurrent->ulBlockOffset += + sizeof(pInfoCurrent->aucBlock); } else { /* Next block, first part */ - pBlockCurrent = pBlockCurrent->pNext; - ulBlockOffset = 0; + pInfoCurrent->pBlockCurrent = + pInfoCurrent->pBlockCurrent->pNext; + pInfoCurrent->ulBlockOffset = 0; } - if (pBlockCurrent == NULL) { + if (pInfoCurrent->pBlockCurrent == NULL) { /* Past the last part of the last block */ return (USHORT)EOF; } tReadLen = (size_t) - (pBlockCurrent->tInfo.ulLength - ulBlockOffset); - if (tReadLen > sizeof(aucBlock)) { - tReadLen = sizeof(aucBlock); + (pInfoCurrent->pBlockCurrent->tInfo.ulLength - + pInfoCurrent->ulBlockOffset); + if (tReadLen > sizeof(pInfoCurrent->aucBlock)) { + tReadLen = sizeof(pInfoCurrent->aucBlock); } - ulReadOff = pBlockCurrent->tInfo.ulFileOffset + - ulBlockOffset; - if (!bReadBytes(aucBlock, tReadLen, ulReadOff, pFile)) { + ulReadOff = pInfoCurrent->pBlockCurrent->tInfo.ulFileOffset + + pInfoCurrent->ulBlockOffset; + if (!bReadBytes(pInfoCurrent->aucBlock, + tReadLen, ulReadOff, pFile)) { /* Don't read from this list any longer */ - pBlockCurrent = NULL; + pInfoCurrent->pBlockCurrent = NULL; return (USHORT)EOF; } - tByteNext = 0; + pInfoCurrent->tByteNext = 0; } if (pulFileOffset != NULL) { - *pulFileOffset = pBlockCurrent->tInfo.ulFileOffset + - ulBlockOffset + tByteNext; + *pulFileOffset = + pInfoCurrent->pBlockCurrent->tInfo.ulFileOffset + + pInfoCurrent->ulBlockOffset + + pInfoCurrent->tByteNext; } if (pulCharPos != NULL) { - *pulCharPos = pBlockCurrent->tInfo.ulCharPos + - ulBlockOffset + tByteNext; + *pulCharPos = + pInfoCurrent->pBlockCurrent->tInfo.ulCharPos + + pInfoCurrent->ulBlockOffset + + pInfoCurrent->tByteNext; } if (pusPropMod != NULL) { - *pusPropMod = pBlockCurrent->tInfo.usPropMod; + *pusPropMod = pInfoCurrent->pBlockCurrent->tInfo.usPropMod; } - return (USHORT)aucBlock[tByteNext++]; + return (USHORT)pInfoCurrent->aucBlock[pInfoCurrent->tByteNext++]; } /* end of usGetNextByte */ + /* * usGetNextChar - get the next character from the specified block list */ static USHORT - usGetNextChar(FILE *pFile, list_mem_type *pAnchor, + usGetNextChar(FILE *pFile, list_id_enum eListID, ULONG *pulFileOffset, ULONG *pulCharPos, USHORT *pusPropMod) { + readinfo_type *pReadinfo; + list_mem_type *pAnchor; USHORT usLSB, usMSB; - usLSB = usGetNextByte(pFile, pAnchor, - pulFileOffset, pulCharPos, pusPropMod); + switch (eListID) { + case text_list: + pReadinfo = &tOthers; + pAnchor = pTextAnchor; + break; + case footnote_list: + pReadinfo = &tFootnote; + pAnchor = pFootnoteAnchor; + break; + case hdrftr_list: + pReadinfo = &tHdrFtr; + pAnchor = pHdrFtrAnchor; + break; + case endnote_list: + pReadinfo = &tOthers; + pAnchor = pEndnoteAnchor; + break; + case textbox_list: + pReadinfo = &tOthers; + pAnchor = pTextBoxAnchor; + break; + case hdrtextbox_list: + pReadinfo = &tOthers; + pAnchor = pHdrTextBoxAnchor; + break; + default: + DBG_DEC(eListID); + return (USHORT)EOF; + } + + usLSB = usGetNextByte(pFile, pReadinfo, pAnchor, + pulFileOffset, pulCharPos, pusPropMod); if (usLSB == (USHORT)EOF) { return (USHORT)EOF; } - if (pBlockCurrent->tInfo.bUsesUnicode) { - usMSB = usGetNextByte(pFile, pAnchor, - NULL, NULL, NULL); + fail(pReadinfo->pBlockCurrent == NULL); + + if (pReadinfo->pBlockCurrent->tInfo.bUsesUnicode) { + usMSB = usGetNextByte(pFile, + pReadinfo, pAnchor, NULL, NULL, NULL); } else { usMSB = 0x00; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:556,588 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:625,632 fail(pFile == NULL); - switch (eListID) { - case text_list: - usRetVal = usGetNextChar(pFile, pTextAnchor, + usRetVal = usGetNextChar(pFile, eListID, pulFileOffset, pulCharPos, pusPropMod); - break; - case footnote_list: - usRetVal = usGetNextChar(pFile, pFootAnchor, - pulFileOffset, pulCharPos, pusPropMod); - break; - case endnote_list: - usRetVal = usGetNextChar(pFile, pEndAnchor, - pulFileOffset, pulCharPos, pusPropMod); - break; - case textbox_list: - usRetVal = usGetNextChar(pFile, pTextBoxAnchor, - pulFileOffset, pulCharPos, pusPropMod); - break; - case hdrtextbox_list: - usRetVal = usGetNextChar(pFile, pHdrTextBoxAnchor, - pulFileOffset, pulCharPos, pusPropMod); - break; - default: - DBG_DEC(eListID); - usRetVal = (USHORT)EOF; - break; - } - if (usRetVal == (USHORT)EOF) { if (pulFileOffset != NULL) { *pulFileOffset = FC_INVALID; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:598,604 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:642,686 } /* end of usNextChar */ /* - * Translate a character position to an offset in the file. + * usToHdrFtrPosition - Go to a character position in header/foorter list + * + * Returns the character found on the specified character position + */ + USHORT + usToHdrFtrPosition(FILE *pFile, ULONG ulCharPos) + { + ULONG ulCharPosCurr; + USHORT usChar; + + tHdrFtr.pBlockCurrent = NULL; /* To reset the header/footer list */ + do { + usChar = usNextChar(pFile, + hdrftr_list, NULL, &ulCharPosCurr, NULL); + } while (usChar != (USHORT)EOF && ulCharPosCurr != ulCharPos); + return usChar; + } /* end of usToHdrFtrPosition */ + + /* + * usToFootnotePosition - Go to a character position in footnote list + * + * Returns the character found on the specified character position + */ + USHORT + usToFootnotePosition(FILE *pFile, ULONG ulCharPos) + { + ULONG ulCharPosCurr; + USHORT usChar; + + tFootnote.pBlockCurrent = NULL; /* To reset the footnote list */ + do { + usChar = usNextChar(pFile, + footnote_list, NULL, &ulCharPosCurr, NULL); + } while (usChar != (USHORT)EOF && ulCharPosCurr != ulCharPos); + return usChar; + } /* end of usToFootnotePosition */ + + /* + * Convert a character position to an offset in the file. * Logical to physical offset. * * Returns: FC_INVALID: in case of error /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:605,624 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:687,723 * otherwise: the computed file offset */ ULONG - ulCharPos2FileOffset(ULONG ulCharPos) + ulCharPos2FileOffsetX(ULONG ulCharPos, list_id_enum *peListID) { - list_mem_type *apAnchors[5]; + static list_id_enum eListIDs[8] = { + text_list, footnote_list, hdrftr_list, + macro_list, annotation_list, endnote_list, + textbox_list, hdrtextbox_list, + }; + list_mem_type *apAnchors[8]; list_mem_type *pCurr; + list_id_enum eListGuess; ULONG ulBestGuess; size_t tIndex; + fail(peListID == NULL); + + if (ulCharPos == CP_INVALID) { + *peListID = no_list; + return FC_INVALID; + } + apAnchors[0] = pTextAnchor; - apAnchors[1] = pFootAnchor; - apAnchors[2] = pEndAnchor; - apAnchors[3] = pTextBoxAnchor; - apAnchors[4] = pHdrTextBoxAnchor; + apAnchors[1] = pFootnoteAnchor; + apAnchors[2] = pHdrFtrAnchor; + apAnchors[3] = pMacroAnchor; + apAnchors[4] = pAnnotationAnchor; + apAnchors[5] = pEndnoteAnchor; + apAnchors[6] = pTextBoxAnchor; + apAnchors[7] = pHdrTextBoxAnchor; - ulBestGuess = FC_INVALID; /* Best guess is "fileoffset not found" */ + eListGuess = no_list; /* Best guess is no list */ + ulBestGuess = FC_INVALID; /* Best guess is "file offset not found" */ for (tIndex = 0; tIndex < elementsof(apAnchors); tIndex++) { for (pCurr = apAnchors[tIndex]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:632,637 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:731,737 * block, so we guess it's the first byte of * the next block (if there is a next block) */ + eListGuess= eListIDs[tIndex]; ulBestGuess = pCurr->pNext->tInfo.ulFileOffset; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:643,648 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:743,749 } /* The character position is in the current block */ + *peListID = eListIDs[tIndex]; return pCurr->tInfo.ulFileOffset + ulCharPos - pCurr->tInfo.ulCharPos; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/blocklist.c:650,657 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/blocklist.c:751,798 /* Passed beyond the end of the last list */ NO_DBG_HEX(ulCharPos); NO_DBG_HEX(ulBestGuess); + *peListID = eListGuess; return ulBestGuess; + } /* end of ulCharPos2FileOffsetX */ + + /* + * Convert a character position to an offset in the file. + * Logical to physical offset. + * + * Returns: FC_INVALID: in case of error + * otherwise: the computed file offset + */ + ULONG + ulCharPos2FileOffset(ULONG ulCharPos) + { + list_id_enum eListID; + + return ulCharPos2FileOffsetX(ulCharPos, &eListID); } /* end of ulCharPos2FileOffset */ + + /* + * Convert an offset in the header/footer list to a character position. + * + * Returns: CP_INVALID: in case of error + * otherwise: the computed character position + */ + ULONG + ulHdrFtrOffset2CharPos(ULONG ulHdrFtrOffset) + { + list_mem_type *pCurr; + ULONG ulOffset; + + ulOffset = ulHdrFtrOffset; + for (pCurr = pHdrFtrAnchor; pCurr != NULL; pCurr = pCurr->pNext) { + if (ulOffset >= pCurr->tInfo.ulLength) { + /* The offset is not in this block */ + ulOffset -= pCurr->tInfo.ulLength; + continue; + } + return pCurr->tInfo.ulCharPos + ulOffset; + } + return CP_INVALID; + } /* end of ulHdrFtrOffset2CharPos */ /* * Get the sequence number beloning to the given file offset [jmk] --rw-rw-r-- M 499692 jmk sys 22483 Jan 14 12:57 sys/src/cmd/aux/antiword/blocklist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22456 Jan 14 12:57 sys/src/cmd/aux/antiword/chartrans.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:1,6 /* * chartrans.c - * Copyright (C) 1999-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL * * Description: * Translate Word characters to local representation /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:14,20 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:14,20 #endif /* __STDC_ISO_10646__ */ #include "antiword.h" - static const USHORT usCp850[] = { + static const USHORT usCp850[] = { /* DOS implementation of Latin1 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:33,39 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:33,39 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; - static const USHORT usCp1250[] = { + static const USHORT usCp1250[] = { /* Windows implementation of Latin2 */ 0x20ac, 0x003f, 0x201a, 0x003f, 0x201e, 0x2026, 0x2020, 0x2021, 0x003f, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, 0x003f, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:52,65 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:52,96 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; - static const USHORT usCp1252[] = { + static const USHORT usCp1251[] = { /* Windows implementation of Cyrillic */ + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, + 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x00f3, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, + 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, + 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, + 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + }; + + static const USHORT usCp1252[] = { /* Windows implementation of Latin1 */ 0x20ac, 0x003f, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x003f, 0x017d, 0x003f, 0x003f, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x003f, 0x017e, 0x0178, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, }; - static const USHORT usMacRoman[] = { + static const USHORT usMacRoman[] = { /* Apple implementation of Latin1 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:110,120 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:141,152 }; typedef struct char_table_tag { - USHORT usLocal; + UCHAR ucLocal; USHORT usUnicode; } char_table_type; - static char_table_type atCharTable[128]; + static char_table_type atCharTable[256]; + static size_t tNextPosFree = 0; /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:151,181 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:183,253 { char_table_type tKey; + if (tNextPosFree == 0) { + return NULL; + } tKey.usUnicode = usUnicode; - tKey.usLocal = 0; + tKey.ucLocal = 0; return (char_table_type *)bsearch(&tKey, atCharTable, - elementsof(atCharTable), sizeof(atCharTable[0]), + tNextPosFree, sizeof(atCharTable[0]), iCompare); } /* end of pGetCharTableRecord */ /* - * ucGetNbspValue - get the local representation of the non-breaking space + * ucGetBulletCharacter - get the local representation of the bullet */ UCHAR - ucGetNbspValue(void) + ucGetBulletCharacter(conversion_type eConversionType, encoding_type eEncoding) { + #if defined(__riscos) + return 0x8f; + #else const char_table_type *pRec; + fail(eEncoding == encoding_utf_8); + + if (eEncoding == encoding_latin_1 && + (eConversionType == conversion_ps || + eConversionType == conversion_pdf)) { + /* Ugly, but it makes the PostScript and PDF look better */ + return (UCHAR)143; + } + if (eConversionType != conversion_text && + eConversionType != conversion_fmt_text) { + pRec = pGetCharTableRecord(UNICODE_BULLET); + if (pRec != NULL) { + return pRec->ucLocal; + } + pRec = pGetCharTableRecord(UNICODE_BULLET_OPERATOR); + if (pRec != NULL) { + return pRec->ucLocal; + } + pRec = pGetCharTableRecord(UNICODE_MIDDLE_DOT); + if (pRec != NULL) { + return pRec->ucLocal; + } + } + return (UCHAR)'.'; + #endif /* __riscos */ + } /* end of ucGetBulletCharacter */ + + /* + * ucGetNbspCharacter - get the local representation of the non-breaking space + */ + UCHAR + ucGetNbspCharacter(void) + { + const char_table_type *pRec; + pRec = pGetCharTableRecord(0x00a0); /* Unicode non-breaking space */ - if (pRec == NULL || pRec->usLocal > 0xff) { - DBG_MSG_C(pRec == NULL, "Non-breaking space record not found"); - DBG_HEX_C(pRec != NULL, pRec->usLocal); + if (pRec == NULL) { + DBG_MSG("Non-breaking space record not found"); /* No value found, use the best guess */ return (UCHAR)0xa0; } - return (UCHAR)pRec->usLocal; - } /* end of ucGetNbspValue */ + return pRec->ucLocal; + } /* end of ucGetNbspCharacter */ /* * bReadCharacterMappingTable - read the mapping table /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:185,193 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:257,264 * returns TRUE if successful, otherwise FALSE */ BOOL - bReadCharacterMappingTable(const char *szFilename) + bReadCharacterMappingTable(FILE *pFile) { - FILE *pFile; char *pcTmp; ULONG ulUnicode; UINT uiLocal; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:194,213 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:265,278 int iFields; char szLine[81]; - DBG_MSG(szFilename); - - fail(szFilename == NULL); - - if (szFilename == NULL || szFilename[0] == '\0') { - return FALSE; - } - pFile = fopen(szFilename, "r"); if (pFile == NULL) { - DBG_MSG(szFilename); return FALSE; } + + /* Clean the table first */ (void)memset(atCharTable, 0, sizeof(atCharTable)); + /* Fill the table */ while (fgets(szLine, (int)sizeof(szLine), pFile)) { if (szLine[0] == '#' || szLine[0] == '\r' || /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:233,256 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:298,327 uiLocal, ulUnicode); continue; } - if (uiLocal >= 0x80) { - atCharTable[uiLocal - 0x80].usLocal = - (USHORT)uiLocal; - atCharTable[uiLocal - 0x80].usUnicode = - (USHORT)ulUnicode; + /* Store only the relevant entries */ + if (uiLocal != ulUnicode || uiLocal >= 0x80) { + atCharTable[tNextPosFree].ucLocal = (UCHAR)uiLocal; + atCharTable[tNextPosFree].usUnicode = (USHORT)ulUnicode; + tNextPosFree++; } + if (tNextPosFree >= elementsof(atCharTable)) { + werr(0, "Too many entries in the character mapping " + "file. Ignoring the rest."); + break; + } } - (void)fclose(pFile); - DBG_HEX(atCharTable[0].usUnicode); - DBG_HEX(atCharTable[elementsof(atCharTable)-1].usUnicode); + if (tNextPosFree != 0) { + DBG_HEX(atCharTable[0].usUnicode); + DBG_HEX(atCharTable[tNextPosFree - 1].usUnicode); - qsort(atCharTable, - elementsof(atCharTable), sizeof(atCharTable[0]), - iCompare); + qsort(atCharTable, + tNextPosFree, sizeof(atCharTable[0]), + iCompare); - DBG_HEX(atCharTable[0].usUnicode); - DBG_HEX(atCharTable[elementsof(atCharTable)-1].usUnicode); + DBG_HEX(atCharTable[0].usUnicode); + DBG_HEX(atCharTable[tNextPosFree - 1].usUnicode); + } return TRUE; } /* end of bReadCharacterMappingTable */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:268,302 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:339,376 BOOL bUseMacCharSet) { const char_table_type *pTmp; + const USHORT *usCharSet; + usCharSet = NULL; if (bUseMacCharSet) { - /* Translate special Macintosh characters */ - if (usChar >= 0x80 && usChar <= 0xff) { - usChar = usMacRoman[usChar - 0x80]; - } + /* Macintosh character set */ + usCharSet = usMacRoman; } else if (iWordVersion == 0) { - /* From Code Page 850 to Unicode */ - if (usChar >= 0x80 && usChar <= 0xff) { - usChar = usCp850[usChar - 0x80]; - } + /* DOS character set */ + usCharSet = usCp850; } else { - if (eEncoding == encoding_iso_8859_2) { - /* Translate implementation defined characters */ - if (usChar >= 0x80 && usChar <= 0x9f) { - usChar = usCp1250[usChar - 0x80]; - } - /* From Code Page 1250 to Unicode */ - if (iWordVersion < 8 && - usChar >= 0xa0 && usChar <= 0xff) { - usChar = usCp1250[usChar - 0x80]; - } - } else { - /* Translate implementation defined characters */ - if (usChar >= 0x80 && usChar <= 0x9f) { - usChar = usCp1252[usChar - 0x80]; - } + /* Windows character set */ + switch (eEncoding) { + case encoding_latin_2: + usCharSet = usCp1250; + break; + case encoding_cyrillic: + usCharSet = usCp1251; + break; + case encoding_latin_1: + default: + usCharSet = usCp1252; + break; } } + fail(usCharSet == NULL); + if (usChar >= 0x80 && usChar <= 0x9f) { + /* Translate implementation defined characters */ + usChar = usCharSet[usChar - 0x80]; + } else if (iWordVersion < 8 && usChar >= 0xa0 && usChar <= 0xff) { + /* Translate old character set to Unixcode */ + usChar = usCharSet[usChar - 0x80]; + } /* Microsoft Unicode to real Unicode */ if (usChar >= 0xf020 && usChar <= 0xf0ff) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:339,345 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:413,419 break; } - if (eEncoding != encoding_utf8) { + if (eEncoding != encoding_utf_8) { /* Latin characters in an oriental text */ if (usChar >= 0xff01 && usChar <= 0xff5e) { usChar -= 0xfee0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:346,353 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:420,429 } } - if (eConversionType == conversion_ps && - eEncoding == encoding_iso_8859_1) { + if (eEncoding == encoding_latin_1 && + (eConversionType == conversion_ps || + eConversionType == conversion_pdf)) { + /* Ugly, but it makes the PostScript and PDF look better */ switch (usChar) { case UNICODE_ELLIPSIS: return 140; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:356,363 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:432,440 case UNICODE_PER_MILLE_SIGN: return 142; case UNICODE_BULLET: + case UNICODE_BULLET_OPERATOR: case UNICODE_BLACK_CLUB_SUIT: - return (ULONG)(UCHAR)OUR_BULLET_PS; + return 143; case UNICODE_LEFT_SINGLE_QMARK: return 144; case UNICODE_RIGHT_SINGLE_QMARK: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:395,400 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:472,496 } } + if (eConversionType == conversion_pdf) { + if (eEncoding == encoding_latin_1) { + switch (usChar) { + case UNICODE_EURO_SIGN: + return 128; + default: + break; + } + } else if (eEncoding == encoding_latin_2) { + switch (usChar) { + case UNICODE_CAPITAL_D_WITH_STROKE: + case UNICODE_SMALL_D_WITH_STROKE: + return 0x3f; + default: + break; + } + } + } + if (usChar < 0x80) { /* US ASCII */ if (usChar < 0x20 || usChar == 0x7f) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:406,412 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:502,508 return (ULONG)usChar; } - if (eEncoding == encoding_utf8) { + if (eEncoding == encoding_utf_8) { /* No need to convert Unicode characters */ return (ULONG)usChar; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:415,421 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:511,517 pTmp = pGetCharTableRecord(usChar); if (pTmp != NULL) { DBG_HEX_C(usChar >= 0x7f && usChar <= 0x9f, usChar); - return (ULONG)pTmp->usLocal; + return (ULONG)pTmp->ucLocal; } /* Fancy characters to simple US ASCII */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:442,447 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:538,544 case UNICODE_FIGURE_SPACE: case UNICODE_PUNCTUATION_SPACE: case UNICODE_THIN_SPACE: + case UNICODE_NARROW_NO_BREAK_SPACE: case UNICODE_LIGHT_SHADE: case UNICODE_MEDIUM_SHADE: case UNICODE_DARK_SHADE: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:479,494 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:576,602 case UNICODE_DOUBLE_DAGGER: return (ULONG)'#'; case UNICODE_BULLET: + case UNICODE_BULLET_OPERATOR: case UNICODE_BLACK_CLUB_SUIT: - return (ULONG)OUR_BULLET_TEXT; + return (ULONG)ucGetBulletCharacter(eConversionType, eEncoding); case UNICODE_ONE_DOT_LEADER: + case UNICODE_TWO_DOT_LEADER: return (ULONG)'.'; case UNICODE_ELLIPSIS: + #if defined(__riscos) return (ULONG)OUR_ELLIPSIS; + #else + if (ulFileOffset == 0) { + return (ULONG)OUR_ELLIPSIS; + } + return UNICODE_ELLIPSIS; + #endif /* __riscos */ + case UNICODE_DOUBLE_LEFT_ANGLE_QMARK: case UNICODE_TRIANGULAR_BULLET: case UNICODE_SINGLE_LEFT_ANGLE_QMARK: case UNICODE_LEFTWARDS_ARROW: return (ULONG)'<'; + case UNICODE_DOUBLE_RIGHT_ANGLE_QMARK: case UNICODE_SINGLE_RIGHT_ANGLE_QMARK: case UNICODE_RIGHTWARDS_ARROW: return (ULONG)'>'; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:503,508 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:611,618 return (ULONG)'O'; case UNICODE_DIAMOND: return (ULONG)OUR_DIAMOND; + case UNICODE_NUMERO_SIGN: + return (ULONG)'N'; case UNICODE_KELVIN_SIGN: return (ULONG)'K'; case UNICODE_DOWNWARDS_ARROW: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/chartrans.c:542,547 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/chartrans.c:652,661 case UNICODE_RIGHT_TO_LEFT_MARK: case UNICODE_LEFT_TO_RIGHT_EMBEDDING: case UNICODE_RIGHT_TO_LEFT_EMBEDDING: + case UNICODE_POP_DIRECTIONAL_FORMATTING: + case UNICODE_LEFT_TO_RIGHT_OVERRIDE: + case UNICODE_RIGHT_TO_LEFT_OVERRIDE: + case UNICODE_ZERO_WIDTH_NO_BREAK_SPACE: return IGNORE_CHARACTER; default: break; [jmk] --rw-rw-r-- M 499692 jmk sys 22456 Jan 14 12:57 sys/src/cmd/aux/antiword/chartrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 8933 Jan 14 12:57 sys/src/cmd/aux/antiword/datalist.c [jmk] --rw-rw-r-- M 499692 jmk sys 8933 Jan 14 12:57 sys/src/cmd/aux/antiword/datalist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3153 Jan 14 12:57 sys/src/cmd/aux/antiword/debug.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/debug.h:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/debug.h:1,6 /* * debug.h - * Copyright (C) 1998-2001 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GPL * * Description: * Macro's for debuging. /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/debug.h:98,102 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/debug.h:98,117 #define NO_DBG_DEC_C(c,m) /* EMPTY */ #define NO_DBG_HEX_C(c,m) /* EMPTY */ #define NO_DBG_FLT_C(c,m) /* EMPTY */ + + #if defined(TRACE) + + #define TRACE_MSG(t) do {\ + (void)fprintf(stderr,\ + "%s[%3d]: TRACE:%.40s\n",\ + __FILE__, __LINE__, (t));\ + (void)fflush(stderr);\ + } while(0) + + #else + + #define TRACE_MSG(t) /* EMPTY */ + + #endif /* TRACE */ #endif /* !__debug_h */ [jmk] --rw-rw-r-- M 499692 jmk sys 3153 Jan 14 12:57 sys/src/cmd/aux/antiword/debug.h [jmk] --rw-rw-r-- M 499692 jmk sys 2724 Jan 14 12:57 sys/src/cmd/aux/antiword/depot.c [jmk] --rw-rw-r-- M 499692 jmk sys 2724 Jan 14 12:57 sys/src/cmd/aux/antiword/depot.c [jmk] --rw-rw-r-- M 499692 jmk sys 12146 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 12146 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 14486 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2sprt.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:8,14 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:8,15 #include #include - #include "wimpt.h" + #include "DeskLib:Error.h" + #include "DeskLib:Sprite.h" #include "antiword.h" #if 0 /* defined(DEBUG) */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:37,72 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:38,75 } /* end of iGetByteWidth */ /* - * bCreateBlankSprite - Create a blank sprite. + * pCreateBlankSprite - Create a blank sprite. * * Create a blank sprite and add a palette if needed * * returns a pointer to the sprite when successful, otherwise NULL */ - static UCHAR * - pucCreateBlankSprite(const imagedata_type *pImg, size_t *ptSize) + static sprite_areainfo * + pCreateBlankSprite(const imagedata_type *pImg, size_t *pSize) { - sprite_area *pArea; + sprite_areainfo *pArea; UCHAR *pucTmp; size_t tSize; - int iIndex, iMode, iPaletteEntries, iByteWidth; + screen_modeval uMode; + int iIndex, iPaletteEntries; - DBG_MSG("pCreateBlankSprite"); + TRACE_MSG("pCreateBlankSprite"); fail(pImg == NULL); + fail(pSize == NULL); switch (pImg->uiBitsPerComponent) { case 1: - iMode = 18; + uMode.screen_mode = 18; iPaletteEntries = 2; break; case 4: - iMode = 20; + uMode.screen_mode = 20; iPaletteEntries = 16; break; case 8: case 24: - iMode = 21; + uMode.screen_mode = 21; iPaletteEntries = 0; break; default: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:75,100 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:78,103 } fail(iPaletteEntries < 0 || iPaletteEntries > 16); - /* Create the sprite */ - - iByteWidth = iGetByteWidth(pImg); - - tSize = sizeof(sprite_area) + - sizeof(sprite_header) + - iPaletteEntries * 8 + - iByteWidth * pImg->iHeight; + /* Get memory for the sprite */ + tSize = sizeof(sprite_areainfo) + + Sprite_MemorySize(pImg->iWidth, pImg->iHeight, uMode, + iPaletteEntries > 0 ? sprite_HASPAL : sprite_HASNOMASKPAL); DBG_DEC(tSize); pArea = xmalloc(tSize); - sprite_area_initialise(pArea, tSize); - wimpt_noerr(sprite_create(pArea, "wordimage", - iPaletteEntries > 0 ? sprite_haspalette : sprite_nopalette, - pImg->iWidth, pImg->iHeight, iMode)); + /* Initialise sprite area */ + pArea->areasize = tSize; + pArea->numsprites = 0; + pArea->firstoffset = sizeof(sprite_areainfo); + pArea->freeoffset = sizeof(sprite_areainfo); - /* Add the palette */ + /* Create a blank sprite */ + Error_CheckFatal(Sprite_Create(pArea, "wordimage", + iPaletteEntries > 0 ? 1 : 0, + pImg->iWidth, pImg->iHeight, uMode)); - pucTmp = (UCHAR *)pArea + - sizeof(sprite_area) + sizeof(sprite_header); + /* Add the palette */ + pucTmp = (UCHAR *)pArea + pArea->firstoffset + sizeof(sprite_header); for (iIndex = 0; iIndex < iPaletteEntries; iIndex++) { /* First color */ *pucTmp++ = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:108,118 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:111,119 *pucTmp++ = pImg->aucPalette[iIndex][2]; } - if (ptSize != NULL) { - *ptSize = tSize; - } - return (UCHAR *)pArea; - } /* end of pucCreateBlankSprite */ + *pSize = tSize; + return pArea; + } /* end of pCreateBlankSprite */ /* * iReduceColor - reduce from 24 bit to 8 bit color /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:505,511 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:506,513 static void vDecodeDIB(diagram_type *pDiag, FILE *pFile, const imagedata_type *pImg) { - UCHAR *pucSprite, *pucPalette, *pucData; + sprite_areainfo *pSprite; + UCHAR *pucPalette, *pucData; size_t tSpriteSize; int iHeaderSize; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:518,526 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:520,529 pImg->iColorsUsed * ((iHeaderSize > 12) ? 4 : 3)); } - /* Create an empty sprite */ - pucSprite = pucCreateBlankSprite(pImg, &tSpriteSize); - pucPalette = pucSprite + sizeof(sprite_area) + sizeof(sprite_header); + /* Create an blank sprite */ + pSprite = pCreateBlankSprite(pImg, &tSpriteSize); + pucPalette = (UCHAR *)pSprite + + pSprite->firstoffset + sizeof(sprite_header); /* Add the pixel information */ switch (pImg->uiBitsPerComponent) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:542,548 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:545,551 case 8: fail(pImg->eCompression != compression_none && pImg->eCompression != compression_rle8); - pucData = pucPalette; + pucData = pucPalette + 0 * 8; if (pImg->eCompression == compression_rle8) { vDecodeRle8(pFile, pucData, pImg); } else { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:551,557 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:554,560 break; case 24: fail(pImg->eCompression != compression_none); - pucData = pucPalette; + pucData = pucPalette + 0 * 8; vDecode24bpp(pFile, pucData, pImg); break; default: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:560,575 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/dib2sprt.c:563,578 } #if 0 /* defined(DEBUG) */ - vCopy2File(pucSprite, tSpriteSize); + vCopy2File((UCHAR *)pSprite, tSpriteSize); #endif /* DEBUG */ /* Add the sprite to the Draw file */ vImage2Diagram(pDiag, pImg, - pucSprite + sizeof(sprite_area), - tSpriteSize - sizeof(sprite_area)); + (UCHAR *)pSprite + pSprite->firstoffset, + tSpriteSize - pSprite->firstoffset); /* Clean up before you leave */ - pucSprite = xfree(pucSprite); + pSprite = xfree(pSprite); } /* end of vDecodeDIB */ /* [jmk] --rw-rw-r-- M 499692 jmk sys 14486 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 1610 Jan 14 12:57 sys/src/cmd/aux/antiword/doclist.c [jmk] --rw-rw-r-- M 499692 jmk sys 26682 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:1,6 /* * draw.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GPL * * Description: * Functions to deal with the Draw format /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:9,23 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:9,24 #include #include #include - #include "akbd.h" - #include "flex.h" - #include "wimp.h" - #include "template.h" - #include "wimpt.h" - #include "win.h" + #include "DeskLib:KeyCodes.h" + #include "DeskLib:Error.h" + #include "DeskLib:Menu.h" + #include "DeskLib:Template.h" + #include "DeskLib:Window.h" + #include "DeskLib:EventMsg.h" + #include "flexlib:flex.h" + #include "drawfile.h" #include "antiword.h" - /* The work area must be a little bit larger than the diagram */ #define WORKAREA_EXTENSION 5 /* Diagram memory */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:27,99 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:28,125 #define WINDOW_TITLE_LEN 28 #define FILENAME_TITLE_LEN (WINDOW_TITLE_LEN - 10) - static BOOL (*bDrawRenderDiag)(draw_diag *, - draw_redrawstr *, double, draw_error *) = NULL; - /* - * vCreateMainWindow - create the Main Window - * - * remark: does not return if the Main Window can't be created - */ - static wimp_w - tCreateMainWindow(void) + #if !defined(__GNUC__) + int + flex_alloc(flex_ptr anchor, int n) { - static int iY = 0; - template *pTemplate; - wimp_w tMainWindow; + void *pvTmp; - /* Find and check the template */ - pTemplate = template_find("MainWindow"); - if (pTemplate == NULL) { - werr(1, "The 'MainWindow' template can't be found"); + TRACE_MSG("flex_alloc"); + + if (anchor == NULL || n < 0) { + return 0; } - pTemplate = template_copy(pTemplate); - if (pTemplate == NULL) { - werr(1, "I can't copy the 'MainWindow' template"); + if (n == 0) { + n = 1; } - if ((pTemplate->window.titleflags & wimp_INDIRECT) != - wimp_INDIRECT) { - werr(1, - "The title of the 'MainWindow' template must be indirected text"); + pvTmp = malloc(n); + if (pvTmp == NULL) { + return 0; } - if (pTemplate->window.title.indirecttext.bufflen < WINDOW_TITLE_LEN) { - werr(1, "The 'MainWindow' title needs %d characters", - WINDOW_TITLE_LEN); + *anchor = pvTmp; + return 1; + } /* end of flex_alloc */ + + void + flex_free(flex_ptr anchor) + { + TRACE_MSG("flex_free"); + + if (anchor == NULL || *anchor == NULL) { + return; } + free(*anchor); + *anchor = NULL; + } /* end of flex_free */ - /* - * Leave 48 OS units between two windows, as recommended by the - * Style guide. And try to stay away from the iconbar. - */ - if (pTemplate->window.box.y0 < iY + 130) { - iY = 48; - } else { - pTemplate->window.box.y0 -= iY; - pTemplate->window.box.y1 -= iY; - iY += 48; + int + flex_extend(flex_ptr anchor, int newsize) + { + void *pvTmp; + + TRACE_MSG("flex_extend"); + + if (anchor == NULL || newsize < 0) { + return 0; } + if (newsize == 0) { + newsize = 1; + } + pvTmp = realloc(*anchor, newsize); + if (pvTmp == NULL) { + return 0; + } + *anchor = pvTmp; + return 1; + } /* end of flex_extend */ + #endif /* !__GNUC__ */ - /* Create the window */ - wimpt_noerr(wimp_create_wind(&pTemplate->window, &tMainWindow)); + /* + * vCreateMainWindow - create the Main window + * + * remark: does not return if the Main window can't be created + */ + static window_handle + tCreateMainWindow(void) + { + window_handle tMainWindow; + + TRACE_MSG("tCreateMainWindow"); + + tMainWindow = Window_Create("MainWindow", template_TITLEMIN); + if (tMainWindow == 0) { + werr(1, "I can't find the 'MainWindow' template"); + } return tMainWindow; } /* end of tCreateMainWindow */ /* - * vCreateScaleWindow - create the Scale view Window + * vCreateScaleWindow - create the Scale view window * - * remark: does not return if the Scale view Window can't be created + * remark: does not return if the Scale view window can't be created */ - static wimp_w + static window_handle tCreateScaleWindow(void) { - wimp_wind *pw; - wimp_w tScaleWindow; + window_handle tScaleWindow; - pw = template_syshandle("ScaleView"); - if (pw == NULL) { - werr(1, "Template 'ScaleView' can't be found"); + TRACE_MSG("tCreateScaleWindow"); + + tScaleWindow = Window_Create("ScaleView", template_TITLEMIN); + if (tScaleWindow == 0) { + werr(1, "I can't find the 'ScaleView' template"); } - wimpt_noerr(wimp_create_wind(pw, &tScaleWindow)); return tScaleWindow; } /* end of tCreateScaleWindow */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:107,121 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:133,148 { diagram_type *pDiag; options_type tOptions; - wimp_w tMainWindow, tScaleWindow; - draw_box tBox; + window_handle tMainWindow, tScaleWindow; + wimp_box tBox; - DBG_MSG("pCreateDiagram"); + TRACE_MSG("pCreateDiagram"); fail(szTask == NULL || szTask[0] == '\0'); /* Create the main window */ tMainWindow = tCreateMainWindow(); + /* Create the scale view window */ tScaleWindow = tCreateScaleWindow(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:125,139 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:152,157 werr(1, "Memory allocation failed, unable to continue"); } - /* Determine which function to use for rendering the diagram */ - if (iGetRiscOsVersion() >= 360) { - /* Home brew for RISC OS 3.6 functionality */ - bDrawRenderDiag = bDrawRenderDiag360; - } else { - /* The function from RISC_OSLib */ - bDrawRenderDiag = draw_render_diag; - } - /* Initialize the diagram */ vGetOptions(&tOptions); pDiag->tMainWindow = tMainWindow; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:141,151 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:159,170 pDiag->iScaleFactorCurr = tOptions.iScaleFactor; pDiag->iScaleFactorTemp = tOptions.iScaleFactor; pDiag->tMemorySize = INITIAL_SIZE; - tBox.x0 = 0; - tBox.y0 = -(draw_screenToDraw(32 + 3) * 8 + 1); - tBox.x1 = draw_screenToDraw(16) * MIN_SCREEN_WIDTH + 1; - tBox.y1 = 0; - draw_create_diag(&pDiag->tInfo, (char *)szTask, tBox); + tBox.min.x = 0; + tBox.min.y = -(Drawfile_ScreenToDraw(32 + 3) * 8 + 1); + tBox.max.x = Drawfile_ScreenToDraw(16) * MIN_SCREEN_WIDTH + 1; + tBox.max.y = 0; + Error_CheckFatal(Drawfile_CreateDiagram(&pDiag->tInfo, + pDiag->tMemorySize, szTask, tBox)); DBG_DEC(pDiag->tInfo.length); pDiag->lXleft = 0; pDiag->lYtop = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:157,210 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:176,253 } /* end of pCreateDiagram */ /* - * vDestroyDiagram - remove a diagram by freeing the memory it uses + * bDestroyDiagram - remove a diagram by freeing the memory it uses */ - static void - vDestroyDiagram(wimp_w tWindow, diagram_type *pDiag) + BOOL + bDestroyDiagram(event_pollblock *pEvent, void *pvReference) { - DBG_MSG("vDestroyDiagram"); + diagram_type *pDiag; + window_handle tWindow; - fail(pDiag != NULL && pDiag->tMainWindow != tWindow); + TRACE_MSG("bDestroyDiagram"); - wimpt_noerr(wimp_close_wind(tWindow)); - if (pDiag == NULL) { - return; + fail(pEvent == NULL); + fail(pvReference == NULL); + + if (pEvent == NULL || pvReference == NULL) { + return FALSE; } - if (pDiag->tInfo.data != NULL && pDiag->tMemorySize != 0) { - flex_free((flex_ptr)&pDiag->tInfo.data); - } - pDiag = xfree(pDiag); - } /* end of vDestroyDiagram */ - /* - * vPrintDrawError - print an error reported by a draw function - */ - static void - vPrintDrawError(draw_error *pError) - { - DBG_MSG("vPrintDrawError"); + pDiag = (diagram_type *)pvReference; - fail(pError == NULL); - - switch (pError->type) { - case DrawOSError: - DBG_DEC(pError->err.os.errnum); - DBG_MSG(pError->err.os.errmess); - werr(1, "DrawOSError: %d: %s", - pError->err.os.errnum, pError->err.os.errmess); + switch (pEvent->type) { + case event_CLOSE: + tWindow = pEvent->data.openblock.window; break; - case DrawOwnError: - DBG_DEC(pError->err.draw.code); - DBG_HEX(pError->err.draw.location); - werr(1, "DrawOwnError: Code %d - Location &%x", - pError->err.draw.code, pError->err.draw.location); + case event_KEY: + tWindow = pEvent->data.key.caret.window; break; - case None: default: - break; + DBG_DEC(pEvent->type); + return FALSE; } - } /* end of vPrintDrawError */ + if (tWindow != pDiag->tMainWindow) { + return FALSE; + } + /* Delete the main window */ + Window_Delete(pDiag->tMainWindow); + pDiag->tMainWindow = 0; + + /* Delete the scale window */ + Window_Delete(pDiag->tScaleWindow); + pDiag->tScaleWindow = 0; + + #if defined(__GNUC__) + /* + * Remove all references to the diagram that will be free-ed + * by undoing the EventMsg_Claim's from within the Menu_Warn's + */ + while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY, + bSaveTextfile, pDiag)) + ; /* EMPTY */ + while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY, + bSaveDrawfile, pDiag)) + ; /* EMPTY */ + while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY, + bScaleOpenAction, pDiag)) + ; /* EMPTY */ + #endif /* __GNUC__ */ + + /* Free the memory */ + if (pDiag->tInfo.data != NULL && pDiag->tMemorySize != 0) { + flex_free((flex_ptr)&pDiag->tInfo.data); + } + /* Just to be on the save side */ + pDiag->tInfo.data = NULL; + pDiag->tInfo.length = 0; + pDiag->tMemorySize = 0; + + /* Destroy the diagram itself */ + pDiag = xfree(pDiag); + return TRUE; + } /* end of bDestroyDiagram */ + /* * vExtendDiagramSize - make sure the diagram is big enough */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:211,216 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:254,261 static void vExtendDiagramSize(diagram_type *pDiag, size_t tSize) { + TRACE_MSG("vExtendDiagramSize"); + fail(pDiag == NULL || tSize % 4 != 0); while (pDiag->tInfo.length + tSize > pDiag->tMemorySize) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:221,226 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:266,272 pDiag->tMemorySize += EXTENSION_SIZE; NO_DBG_DEC(pDiag->tMemorySize); } + TRACE_MSG("end of vExtendDiagramSize"); } /* end of vExtendDiagramSize */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:229,258 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:275,306 void vPrologue2(diagram_type *pDiag, int iWordVersion) { - draw_objectType tNew; - draw_error tError; - draw_object tHandle; + drawfile_object *pNew; const font_table_type *pTmp; char *pcTmp; size_t tRealSize, tSize; int iCount; + TRACE_MSG("vPrologue2"); + fail(pDiag == NULL); if (tGetFontTableLength() == 0) { return; } - tRealSize = sizeof(draw_fontliststrhdr); + tRealSize = offsetof(drawfile_object, data); pTmp = NULL; while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) { tRealSize += 2 + strlen(pTmp->szOurFontname); } + DBG_DEC(tRealSize); tSize = ROUND4(tRealSize); vExtendDiagramSize(pDiag, tSize); - tNew.fontList = xmalloc(tSize); - tNew.fontList->tag = draw_OBJFONTLIST; - tNew.fontList->size = tSize; - pcTmp = (char *)&tNew.fontList->fontref; + pNew = xmalloc(tSize); + memset(pNew, 0, tSize); + pNew->type = drawfile_TYPE_FONT_TABLE; + pNew->size = tSize; + pcTmp = (char *)&pNew->data.font_table.font_def[0].font_ref; iCount = 0; pTmp = NULL; while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:261,275 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:309,317 strcpy(pcTmp, pTmp->szOurFontname); pcTmp += 1 + strlen(pTmp->szOurFontname); } - memset((char *)tNew.fontList + tRealSize, 0, tSize - tRealSize); - if (draw_createObject(&pDiag->tInfo, tNew, draw_LastObject, - TRUE, &tHandle, &tError)) { - draw_translateText(&pDiag->tInfo); - } else { - DBG_MSG("draw_createObject() failed"); - vPrintDrawError(&tError); - } - tNew.fontList = xfree(tNew.fontList); + Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo, + pDiag->tMemorySize, pNew, TRUE)); + pNew = xfree(pNew); } /* end of vPrologue2 */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:278,292 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:320,334 void vSubstring2Diagram(diagram_type *pDiag, char *szString, size_t tStringLength, long lStringWidth, - UCHAR ucFontColor, USHORT usFontstyle, draw_fontref tFontRef, + UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef, USHORT usFontSize, USHORT usMaxFontSize) { - draw_objectType tNew; - draw_error tError; - draw_object tHandle; + drawfile_object *pNew; long lSizeX, lSizeY, lOffset, l20, lYMove; size_t tRealSize, tSize; + TRACE_MSG("vSubstring2Diagram"); + fail(pDiag == NULL || szString == NULL); fail(pDiag->lXleft < 0); fail(tStringLength != strlen(szString)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:299,308 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:341,350 } if (tFontRef == 0) { - lOffset = draw_screenToDraw(2); - l20 = draw_screenToDraw(32 + 3); - lSizeX = draw_screenToDraw(16); - lSizeY = draw_screenToDraw(32); + lOffset = Drawfile_ScreenToDraw(2); + l20 = Drawfile_ScreenToDraw(32 + 3); + lSizeX = Drawfile_ScreenToDraw(16); + lSizeY = Drawfile_ScreenToDraw(32); } else { lOffset = lToBaseLine(usMaxFontSize); l20 = lWord2DrawUnits20(usMaxFontSize); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:321,356 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:363,398 lYMove = -lMilliPoints2DrawUnits((long)usFontSize * 125); } - tRealSize = sizeof(draw_textstr) + tStringLength; + tRealSize = offsetof(drawfile_object, data); + tRealSize += sizeof(drawfile_text) + tStringLength; tSize = ROUND4(tRealSize); vExtendDiagramSize(pDiag, tSize); - tNew.text = xmalloc(tSize); - tNew.text->tag = draw_OBJTEXT; - tNew.text->size = tSize; - tNew.text->bbox.x0 = (int)pDiag->lXleft; - tNew.text->bbox.y0 = (int)(pDiag->lYtop + lYMove); - tNew.text->bbox.x1 = (int)(pDiag->lXleft + lStringWidth); - tNew.text->bbox.y1 = (int)(pDiag->lYtop + l20 + lYMove); - tNew.text->textcolour = (draw_coltyp)ulColor2Color(ucFontColor); - tNew.text->background = 0xffffff00; /* White */ - tNew.text->textstyle.fontref = tFontRef; - tNew.text->textstyle.reserved8 = 0; - tNew.text->textstyle.reserved16 = 0; - tNew.text->fsizex = (int)lSizeX; - tNew.text->fsizey = (int)lSizeY; - tNew.text->coord.x = (int)pDiag->lXleft; - tNew.text->coord.y = (int)(pDiag->lYtop + lOffset + lYMove); - strncpy(tNew.text->text, szString, tStringLength); - tNew.text->text[tStringLength] = '\0'; - memset((char *)tNew.text + tRealSize, 0, tSize - tRealSize); - if (!draw_createObject(&pDiag->tInfo, tNew, draw_LastObject, - TRUE, &tHandle, &tError)) { - DBG_MSG("draw_createObject() failed"); - vPrintDrawError(&tError); - } - tNew.text = xfree(tNew.text); - draw_translateText(&pDiag->tInfo); + pNew = xmalloc(tSize); + memset(pNew, 0, tSize); + pNew->type = drawfile_TYPE_TEXT; + pNew->size = tSize; + pNew->data.text.bbox.min.x = (int)pDiag->lXleft; + pNew->data.text.bbox.min.y = (int)(pDiag->lYtop + lYMove); + pNew->data.text.bbox.max.x = (int)(pDiag->lXleft + lStringWidth); + pNew->data.text.bbox.max.y = (int)(pDiag->lYtop + l20 + lYMove); + pNew->data.text.fill.value = (int)ulColor2Color(ucFontColor); + pNew->data.text.bg_hint.value = 0xffffff00; /* White */ + pNew->data.text.style.font_ref = tFontRef; + pNew->data.text.style.reserved[0] = 0; + pNew->data.text.style.reserved[1] = 0; + pNew->data.text.style.reserved[2] = 0; + pNew->data.text.xsize = (int)lSizeX; + pNew->data.text.ysize = (int)lSizeY; + pNew->data.text.base.x = (int)pDiag->lXleft; + pNew->data.text.base.y = (int)(pDiag->lYtop + lOffset + lYMove); + strncpy(pNew->data.text.text, szString, tStringLength); + pNew->data.text.text[tStringLength] = '\0'; + Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo, + pDiag->tMemorySize, pNew, TRUE)); + pNew = xfree(pNew); + /*draw_translateText(&pDiag->tInfo);*/ pDiag->lXleft += lStringWidth; + TRACE_MSG("leaving vSubstring2Diagram"); } /* end of vSubstring2Diagram */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:360,373 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:402,412 vImage2Diagram(diagram_type *pDiag, const imagedata_type *pImg, UCHAR *pucImage, size_t tImageSize) { - draw_objectType tTmp; - draw_imageType tNew; - draw_error tError; - draw_object tHandle; + drawfile_object *pNew; long lWidth, lHeight; size_t tRealSize, tSize; - DBG_MSG("vImage2Diagram"); + TRACE_MSG("vImage2Diagram"); fail(pDiag == NULL); fail(pImg == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:384,455 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:423,481 pDiag->lYtop -= lHeight; + tRealSize = offsetof(drawfile_object, data); switch (pImg->eImageType) { case imagetype_is_dib: - tRealSize = sizeof(draw_spristrhdr) + tImageSize; + tRealSize += sizeof(drawfile_sprite) + tImageSize; tSize = ROUND4(tRealSize); vExtendDiagramSize(pDiag, tSize); - tNew.sprite = xmalloc(tSize); - tNew.sprite->tag = draw_OBJSPRITE; - tNew.sprite->size = tSize; - tNew.sprite->bbox.x0 = (int)pDiag->lXleft; - tNew.sprite->bbox.y0 = (int)pDiag->lYtop; - tNew.sprite->bbox.x1 = (int)(pDiag->lXleft + lWidth); - tNew.sprite->bbox.y1 = (int)(pDiag->lYtop + lHeight); - memcpy(&tNew.sprite->sprite, pucImage, tImageSize); - memset((char *)tNew.sprite + tRealSize, 0, tSize - tRealSize); + pNew = xmalloc(tSize); + memset(pNew, 0, tSize); + pNew->type = drawfile_TYPE_SPRITE; + pNew->size = tSize; + pNew->data.sprite.bbox.min.x = (int)pDiag->lXleft; + pNew->data.sprite.bbox.min.y = (int)pDiag->lYtop; + pNew->data.sprite.bbox.max.x = (int)(pDiag->lXleft + lWidth); + pNew->data.sprite.bbox.max.y = (int)(pDiag->lYtop + lHeight); + memcpy(&pNew->data.sprite.header, pucImage, tImageSize); break; case imagetype_is_jpeg: #if defined(DEBUG) (void)bGetJpegInfo(pucImage, tImageSize); #endif /* DEBUG */ - tRealSize = sizeof(draw_jpegstrhdr) + tImageSize; + tRealSize += sizeof(drawfile_jpeg) + tImageSize; tSize = ROUND4(tRealSize); vExtendDiagramSize(pDiag, tSize); - tNew.jpeg = xmalloc(tSize); - tNew.jpeg->tag = draw_OBJJPEG; - tNew.jpeg->size = tSize; - tNew.jpeg->bbox.x0 = (int)pDiag->lXleft; - tNew.jpeg->bbox.y0 = (int)pDiag->lYtop; - tNew.jpeg->bbox.x1 = (int)(pDiag->lXleft + lWidth); - tNew.jpeg->bbox.y1 = (int)(pDiag->lYtop + lHeight); - tNew.jpeg->width = (int)lWidth; - tNew.jpeg->height = (int)lHeight; - tNew.jpeg->xdpi = 90; - tNew.jpeg->ydpi = 90; - tNew.jpeg->trfm[0] = 0x10000; - tNew.jpeg->trfm[1] = 0; - tNew.jpeg->trfm[2] = 0; - tNew.jpeg->trfm[3] = 0x10000; - tNew.jpeg->trfm[4] = (int)pDiag->lXleft; - tNew.jpeg->trfm[5] = (int)pDiag->lYtop; - tNew.jpeg->len = tImageSize; - memcpy(&tNew.jpeg->jpeg, pucImage, tImageSize); - memset((char *)tNew.jpeg + tRealSize, 0, tSize - tRealSize); + pNew = xmalloc(tSize); + memset(pNew, 0, tSize); + pNew->type = drawfile_TYPE_JPEG; + pNew->size = tSize; + pNew->data.jpeg.bbox.min.x = (int)pDiag->lXleft; + pNew->data.jpeg.bbox.min.y = (int)pDiag->lYtop; + pNew->data.jpeg.bbox.max.x = (int)(pDiag->lXleft + lWidth); + pNew->data.jpeg.bbox.max.y = (int)(pDiag->lYtop + lHeight); + pNew->data.jpeg.width = (int)lWidth; + pNew->data.jpeg.height = (int)lHeight; + pNew->data.jpeg.xdpi = 90; + pNew->data.jpeg.ydpi = 90; + pNew->data.jpeg.trfm.entries[0][0] = 0x10000; + pNew->data.jpeg.trfm.entries[0][1] = 0; + pNew->data.jpeg.trfm.entries[1][0] = 0; + pNew->data.jpeg.trfm.entries[1][1] = 0x10000; + pNew->data.jpeg.trfm.entries[2][0] = (int)pDiag->lXleft; + pNew->data.jpeg.trfm.entries[2][1] = (int)pDiag->lYtop; + pNew->data.jpeg.len = tImageSize; + memcpy(pNew->data.jpeg.data, pucImage, tImageSize); break; default: DBG_DEC(pImg->eImageType); + pNew = NULL; break; } - tTmp = *(draw_objectType *)&tNew; - if (!draw_createObject(&pDiag->tInfo, tTmp, draw_LastObject, - TRUE, &tHandle, &tError)) { - DBG_MSG("draw_createObject() failed"); - vPrintDrawError(&tError); - } - - switch (pImg->eImageType) { - case imagetype_is_dib: - tNew.sprite = xfree(tNew.sprite); - break; - case imagetype_is_jpeg: - tNew.jpeg = xfree(tNew.jpeg); - break; - default: - DBG_DEC(pImg->eImageType); - break; - } + Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo, + pDiag->tMemorySize, pNew, TRUE)); + pNew = xfree(pNew); pDiag->lXleft = 0; } /* end of vImage2Diagram */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:461,474 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:487,498 BOOL bAddDummyImage(diagram_type *pDiag, const imagedata_type *pImg) { - draw_objectType tNew; - draw_error tError; - draw_object tHandle; + drawfile_object *pNew; int *piTmp; long lWidth, lHeight; size_t tRealSize, tSize; - DBG_MSG("bAddDummyImage"); + TRACE_MSG("bAddDummyImage"); fail(pDiag == NULL); fail(pImg == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:485,529 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:509,552 pDiag->lYtop -= lHeight; - tRealSize = sizeof(draw_pathstrhdr) + 14 * sizeof(int); + tRealSize = offsetof(drawfile_object, data); + tRealSize += sizeof(drawfile_path) + (14 - 1) * sizeof(int); tSize = ROUND4(tRealSize); vExtendDiagramSize(pDiag, tSize); - tNew.path = xmalloc(tSize); - tNew.path->tag = draw_OBJPATH; - tNew.path->size = tSize; - tNew.path->bbox.x0 = (int)pDiag->lXleft; - tNew.path->bbox.y0 = (int)pDiag->lYtop; - tNew.path->bbox.x1 = (int)(pDiag->lXleft + lWidth); - tNew.path->bbox.y1 = (int)(pDiag->lYtop + lHeight); - tNew.path->fillcolour = -1; - tNew.path->pathcolour = 0x4d4d4d00; /* Gray 70 percent */ - tNew.path->pathwidth = (int)lMilliPoints2DrawUnits(500); - tNew.path->pathstyle.joincapwind = 0; - tNew.path->pathstyle.reserved8 = 0; - tNew.path->pathstyle.tricapwid = 0; - tNew.path->pathstyle.tricaphei = 0; - piTmp = (int *)((char *)tNew.path + sizeof(draw_pathstrhdr)); - *piTmp++ = draw_PathMOVE; - *piTmp++ = tNew.path->bbox.x0; - *piTmp++ = tNew.path->bbox.y0; - *piTmp++ = draw_PathLINE; - *piTmp++ = tNew.path->bbox.x0; - *piTmp++ = tNew.path->bbox.y1; - *piTmp++ = draw_PathLINE; - *piTmp++ = tNew.path->bbox.x1; - *piTmp++ = tNew.path->bbox.y1; - *piTmp++ = draw_PathLINE; - *piTmp++ = tNew.path->bbox.x1; - *piTmp++ = tNew.path->bbox.y0; - *piTmp++ = draw_PathCLOSE; - *piTmp++ = draw_PathTERM; - memset((char *)tNew.path + tRealSize, 0, tSize - tRealSize); - if (!draw_createObject(&pDiag->tInfo, tNew, draw_LastObject, - TRUE, &tHandle, &tError)) { - DBG_MSG("draw_createObject() failed"); - vPrintDrawError(&tError); - } - tNew.path = xfree(tNew.path); + pNew = xmalloc(tSize); + memset(pNew, 0, tSize); + pNew->type = drawfile_TYPE_PATH; + pNew->size = tSize; + pNew->data.path.bbox.min.x = (int)pDiag->lXleft; + pNew->data.path.bbox.min.y = (int)pDiag->lYtop; + pNew->data.path.bbox.max.x = (int)(pDiag->lXleft + lWidth); + pNew->data.path.bbox.max.y = (int)(pDiag->lYtop + lHeight); + pNew->data.path.fill.value = -1; + pNew->data.path.outline.value = 0x4d4d4d00; /* Gray 70 percent */ + pNew->data.path.width = (int)lMilliPoints2DrawUnits(500); + pNew->data.path.style.flags = 0; + pNew->data.path.style.reserved = 0; + pNew->data.path.style.cap_width = 0; + pNew->data.path.style.cap_length = 0; + piTmp = pNew->data.path.path; + *piTmp++ = drawfile_PATH_MOVE_TO; + *piTmp++ = pNew->data.path.bbox.min.x; + *piTmp++ = pNew->data.path.bbox.min.y; + *piTmp++ = drawfile_PATH_LINE_TO; + *piTmp++ = pNew->data.path.bbox.min.x; + *piTmp++ = pNew->data.path.bbox.max.y; + *piTmp++ = drawfile_PATH_LINE_TO; + *piTmp++ = pNew->data.path.bbox.max.x; + *piTmp++ = pNew->data.path.bbox.max.y; + *piTmp++ = drawfile_PATH_LINE_TO; + *piTmp++ = pNew->data.path.bbox.max.x; + *piTmp++ = pNew->data.path.bbox.min.y; + *piTmp++ = drawfile_PATH_CLOSE_LINE; + *piTmp++ = drawfile_PATH_END_PATH; + + Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo, + pDiag->tMemorySize, pNew, TRUE)); + pNew = xfree(pNew); pDiag->lXleft = 0; return TRUE; } /* end of bAddDummyImage */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:532,546 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:555,572 * vMove2NextLine - move to the next line */ void - vMove2NextLine(diagram_type *pDiag, draw_fontref tFontRef, USHORT usFontSize) + vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef, + USHORT usFontSize) { long l20; + TRACE_MSG("vMove2NextLine"); + fail(pDiag == NULL); fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); if (tFontRef == 0) { - l20 = draw_screenToDraw(32 + 3); + l20 = Drawfile_ScreenToDraw(32 + 3); } else { l20 = lWord2DrawUnits20(usFontSize); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:553,558 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:579,586 void vStartOfParagraph1(diagram_type *pDiag, long lBeforeIndentation) { + TRACE_MSG("vStartOfParagraph1"); + fail(pDiag == NULL); fail(lBeforeIndentation < 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:562,572 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:590,601 /* * Create an start of paragraph (Phase 2) + * DUMMY function */ void vStartOfParagraph2(diagram_type *pDiag) { - /* DUMMY */ + TRACE_MSG("vStartOfParagraph2"); } /* end of vStartOfParagraph2 */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:574,581 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:603,612 */ void vEndOfParagraph(diagram_type *pDiag, - draw_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) + drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) { + TRACE_MSG("vEndOfParagraph"); + fail(pDiag == NULL); fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); fail(lAfterIndentation < 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:588,595 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:619,628 * Create an end of page */ void - vEndOfPage(diagram_type *pDiag, long lAfterIndentation) + vEndOfPage(diagram_type *pDiag, long lAfterIndentation, BOOL bNewSection) { + TRACE_MSG("vEndOfPage"); + fail(pDiag == NULL); fail(lAfterIndentation < 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:599,649 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:632,688 /* * vSetHeaders - set the headers + * DUMMY function */ void vSetHeaders(diagram_type *pDiag, USHORT usIstd) { - /* DUMMY */ + TRACE_MSG("vSetHeaders"); } /* end of vSetHeaders */ /* * Create a start of list + * DUMMY function */ void vStartOfList(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable) { - /* DUMMY */ + TRACE_MSG("vStartOfList"); } /* end of vStartOfList */ /* * Create an end of list + * DUMMY function */ void vEndOfList(diagram_type *pDiag) { - /* DUMMY */ + TRACE_MSG("vEndOfList"); } /* end of vEndOfList */ /* * Create a start of a list item + * DUMMY function */ void vStartOfListItem(diagram_type *pDiag, BOOL bNoMarks) { - /* DUMMY */ + TRACE_MSG("vStartOfListItem"); } /* end of vStartOfListItem */ /* * Create an end of a table + * DUMMY function */ void vEndOfTable(diagram_type *pDiag) { - /* DUMMY */ + TRACE_MSG("vEndOfTable"); } /* end of vEndTable */ /* * Add a table row + * DUMMY function * * Returns TRUE when conversion type is XML */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:651,657 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:690,697 bAddTableRow(diagram_type *pDiag, char **aszColTxt, int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo) { - /* DUMMY */ + TRACE_MSG("bAddTableRow"); + return FALSE; } /* end of bAddTableRow */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:661,670 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:701,711 static void vForceRedraw(diagram_type *pDiag) { - wimp_wstate tWindowState; - wimp_redrawstr tRedraw; + window_state tWindowState; + window_redrawblock tRedraw; + int x0, y0, x1, y1; - DBG_MSG("vForceRedraw"); + TRACE_MSG("vForceRedraw"); fail(pDiag == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:671,748 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:712,763 DBG_DEC(pDiag->iScaleFactorCurr); /* Read the size of the current diagram */ - draw_queryBox(&pDiag->tInfo, (draw_box *)&tRedraw.box, TRUE); - tRedraw.w = pDiag->tMainWindow; + Drawfile_QueryBox(&pDiag->tInfo, &tRedraw.rect, TRUE); /* Adjust the size of the work area */ - tRedraw.box.x0 = tRedraw.box.x0 * pDiag->iScaleFactorCurr / 100 - 1; - tRedraw.box.y0 = tRedraw.box.y0 * pDiag->iScaleFactorCurr / 100 - 1; - tRedraw.box.x1 = tRedraw.box.x1 * pDiag->iScaleFactorCurr / 100 + 1; - tRedraw.box.y1 = tRedraw.box.y1 * pDiag->iScaleFactorCurr / 100 + 1; + x0 = tRedraw.rect.min.x * pDiag->iScaleFactorCurr / 100 - 1; + y0 = tRedraw.rect.min.y * pDiag->iScaleFactorCurr / 100 - 1; + x1 = tRedraw.rect.max.x * pDiag->iScaleFactorCurr / 100 + 1; + y1 = tRedraw.rect.max.y * pDiag->iScaleFactorCurr / 100 + 1; /* Work area extension */ - tRedraw.box.x0 -= WORKAREA_EXTENSION; - tRedraw.box.y0 -= WORKAREA_EXTENSION; - tRedraw.box.x1 += WORKAREA_EXTENSION; - tRedraw.box.y1 += WORKAREA_EXTENSION; - wimpt_noerr(wimp_set_extent(&tRedraw)); + x0 -= WORKAREA_EXTENSION; + y0 -= WORKAREA_EXTENSION; + x1 += WORKAREA_EXTENSION; + y1 += WORKAREA_EXTENSION; + Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1); /* Widen the box slightly to be sure all the edges are drawn */ - tRedraw.box.x0 -= 5; - tRedraw.box.y0 -= 5; - tRedraw.box.x1 += 5; - tRedraw.box.y1 += 5; + x0 -= 5; + y0 -= 5; + x1 += 5; + y1 += 5; /* Force the redraw */ - wimpt_noerr(wimp_force_redraw(&tRedraw)); + Window_ForceRedraw(pDiag->tMainWindow, x0, y0, x1, y1); /* Reopen the window to show the correct size */ - wimpt_noerr(wimp_get_wind_state(pDiag->tMainWindow, &tWindowState)); - tWindowState.o.behind = -1; - wimpt_noerr(wimp_open_wind(&tWindowState.o)); + Error_CheckFatal(Wimp_GetWindowState(pDiag->tMainWindow, &tWindowState)); + tWindowState.openblock.behind = -1; + Error_CheckFatal(Wimp_OpenWindow(&tWindowState.openblock)); } /* end of vForceRedraw */ /* - * bVerifyDiagram - Verify the diagram generated from the Word file - * - * returns TRUE if the diagram is correct - */ - BOOL - bVerifyDiagram(diagram_type *pDiag) - { - draw_error tError; - - fail(pDiag == NULL); - DBG_MSG("bVerifyDiagram"); - - if (draw_verify_diag(&pDiag->tInfo, &tError)) { - return TRUE; - } - DBG_MSG("draw_verify_diag() failed"); - vPrintDrawError(&tError); - return FALSE; - } /* end of bVerifyDiagram */ - - /* * vShowDiagram - put the diagram on the screen */ void vShowDiagram(diagram_type *pDiag) { - wimp_wstate tWindowState; - wimp_redrawstr tRedraw; + wimp_box tRect; + int x0, y0, x1, y1; + TRACE_MSG("vShowDiagram"); + fail(pDiag == NULL); - DBG_MSG("vShowDiagram"); - - wimpt_noerr(wimp_get_wind_state(pDiag->tMainWindow, &tWindowState)); - tWindowState.o.behind = -1; - wimpt_noerr(wimp_open_wind(&tWindowState.o)); - - draw_queryBox(&pDiag->tInfo, (draw_box *)&tRedraw.box, TRUE); - tRedraw.w = pDiag->tMainWindow; + Window_Show(pDiag->tMainWindow, open_NEARLAST); + Drawfile_QueryBox(&pDiag->tInfo, &tRect, TRUE); /* Work area extension */ - tRedraw.box.x0 -= WORKAREA_EXTENSION; - tRedraw.box.y0 -= WORKAREA_EXTENSION; - tRedraw.box.x1 += WORKAREA_EXTENSION; - tRedraw.box.y1 += WORKAREA_EXTENSION; - wimpt_noerr(wimp_set_extent(&tRedraw)); + x0 = tRect.min.x - WORKAREA_EXTENSION; + y0 = tRect.min.y - WORKAREA_EXTENSION; + x1 = tRect.max.x + WORKAREA_EXTENSION; + y1 = tRect.max.y + WORKAREA_EXTENSION; + Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1); vForceRedraw(pDiag); } /* end of vShowDiagram */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:749,917 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:764,915 /* * vMainButtonClick - handle mouse buttons clicks for the main screen */ - static void - vMainButtonClick(wimp_mousestr *m) + void + vMainButtonClick(mouse_block *pMouse) { - wimp_caretstr c; - wimp_wstate ws; + caret_block tCaret; + window_state ws; - fail(m == NULL); + TRACE_MSG("vMainButtonClick"); - NO_DBG_HEX(m->bbits); - NO_DBG_DEC(m->i); + fail(pMouse == NULL); - if (m->w >= 0 && - m->i == -1 && - ((m->bbits & wimp_BRIGHT) == wimp_BRIGHT || - (m->bbits & wimp_BLEFT) == wimp_BLEFT)) { + DBG_DEC(pMouse->button.data.select); + DBG_DEC(pMouse->button.data.adjust); + DBG_DEC(pMouse->window); + DBG_DEC(pMouse->icon); + + if (pMouse->window >= 0 && + pMouse->icon == -1 && + (pMouse->button.data.select || pMouse->button.data.adjust)) { /* Get the input focus */ - wimpt_noerr(wimp_get_wind_state(m->w, &ws)); - c.w = m->w; - c.i = -1; - c.x = m->x - ws.o.box.x0; - c.y = m->y - ws.o.box.y1; - c.height = (int)BIT(25); - c.index = 0; - wimpt_noerr(wimp_set_caret_pos(&c)); + Error_CheckFatal(Wimp_GetWindowState(pMouse->window, &ws)); + tCaret.window = pMouse->window; + tCaret.icon = -1; + tCaret.offset.x = pMouse->pos.x - ws.openblock.screenrect.min.x; + tCaret.offset.y = pMouse->pos.y - ws.openblock.screenrect.max.y; + tCaret.height = (int)BIT(25); + tCaret.index = 0; + Error_CheckFatal(Wimp_SetCaretPosition(&tCaret)); } } /* end of vMainButtonClick */ /* - * vMainKeyPressed - handle pressed keys for the main screen + * bMainKeyPressed - handle pressed keys for the main window */ - static void - vMainKeyPressed(int chcode, wimp_caretstr *c, diagram_type *pDiag) + BOOL + bMainKeyPressed(event_pollblock *pEvent, void *pvReference) { - fail(c == NULL || pDiag == NULL); - fail(c->w != pDiag->tMainWindow); + diagram_type *pDiag; - switch (chcode) { - case akbd_Ctl+akbd_Fn+2: /* Ctrl F2 */ - vDestroyDiagram(c->w, pDiag); + TRACE_MSG("bMainKeyPressed"); + + fail(pEvent == NULL); + fail(pEvent->type != event_KEY); + fail(pvReference == NULL); + + pDiag = (diagram_type *)pvReference; + + fail(pEvent->data.key.caret.window != pDiag->tMainWindow); + + + switch (pEvent->data.key.code) { + case keycode_CTRL_F2: /* Ctrl F2 */ + bDestroyDiagram(pEvent, pvReference); break; - case akbd_Fn+3: /* F3 */ - vSaveDrawfile(pDiag); + case keycode_F3: /* F3 */ + bSaveDrawfile(pEvent, pvReference); break; - case akbd_Sh+akbd_Fn+3: /* Shift F3 */ - vSaveTextfile(pDiag); + case keycode_SHIFT_F3: /* Shift F3 */ + bSaveTextfile(pEvent, pvReference); break; default: - DBG_DEC(chcode); - wimpt_noerr(wimp_processkey(chcode)); + DBG_DEC(pEvent->data.key.code); + Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code)); } - } /* end of vMainKeyPressed */ + return TRUE; + } /* end of bMainKeyPressed */ /* - * vRedrawMainWindow - redraw the main window + * bRedrawMainWindow - redraw the main window */ - static void - vRedrawMainWindow(wimp_w tWindow, diagram_type *pDiag) + BOOL + bRedrawMainWindow(event_pollblock *pEvent, void *pvReference) { - wimp_redrawstr r; - draw_error tError; + window_redrawblock tBlock; + diagram_type *pDiag; + drawfile_info *pInfo; double dScaleFactor; - draw_diag *pInfo; BOOL bMore; - fail(pDiag == NULL); - fail(pDiag->tMainWindow != tWindow); + TRACE_MSG("bRedrawMainWindow"); + + fail(pEvent == NULL); + fail(pEvent->type != event_REDRAW); + fail(pvReference == NULL); + + pDiag = (diagram_type *)pvReference; + + fail(pDiag->tMainWindow != pEvent->data.openblock.window); fail(pDiag->iScaleFactorCurr < MIN_SCALE_FACTOR); fail(pDiag->iScaleFactorCurr > MAX_SCALE_FACTOR); - fail(bDrawRenderDiag == NULL); dScaleFactor = (double)pDiag->iScaleFactorCurr / 100.0; pInfo = &pDiag->tInfo; - r.w = tWindow; - wimpt_noerr(wimp_redraw_wind(&r, &bMore)); + tBlock.window = pEvent->data.openblock.window; + Error_CheckFatal(Wimp_RedrawWindow(&tBlock, &bMore)); + /* If there is no real diagram just go thru the motions */ while (bMore) { - if (pInfo->data != NULL) { - if (!bDrawRenderDiag(pInfo, - (draw_redrawstr *)&r, - dScaleFactor, - &tError)) { - DBG_MSG("bDrawRenderDiag() failed"); - vPrintDrawError(&tError); - } + if (pInfo->data != NULL && pInfo->length != 0) { + Error_CheckFatal(Drawfile_RenderDiagram(pInfo, + &tBlock, dScaleFactor)); } - wimp_get_rectangle(&r, &bMore); + Error_CheckFatal(Wimp_GetRectangle(&tBlock, &bMore)); } - } /* end of vRedrawMainWindow */ + return TRUE; + } /* end of bRedrawMainWindow */ /* - * vMainEventHandler - event handler for the main screen + * bScaleOpenAction - action to be taken when the Scale view window opens */ - void - vMainEventHandler(wimp_eventstr *pEvent, void *pvHandle) + BOOL + bScaleOpenAction(event_pollblock *pEvent, void *pvReference) { + window_state tWindowState; diagram_type *pDiag; + TRACE_MSG("bScaleOpenAction"); + fail(pEvent == NULL); + fail(pEvent->type != event_SEND); + fail(pEvent->data.message.header.action != message_MENUWARN); + fail(pvReference == NULL); - pDiag = (diagram_type *)pvHandle; + pDiag = (diagram_type *)pvReference; - switch (pEvent->e) { - case wimp_ENULL: - break; - case wimp_EREDRAW: - vRedrawMainWindow(pEvent->data.o.w, pDiag); - break; - case wimp_EOPEN: - wimpt_noerr(wimp_open_wind(&pEvent->data.o)); - break; - case wimp_ECLOSE: - vDestroyDiagram(pEvent->data.o.w, pDiag); - break; - case wimp_EBUT: - vMainButtonClick(&pEvent->data.but.m); - break; - case wimp_EKEY: - vMainKeyPressed(pEvent->data.key.chcode, - &pEvent->data.key.c, pDiag); - break; - default: - break; + if (menu_currentopen != pDiag->pSaveMenu || + pEvent->data.message.data.menuwarn.selection[0] != SAVEMENU_SCALEVIEW) { + return FALSE; } - } /* end of vMainEventHandler */ - /* - * vScaleOpenAction - action to be taken when the Scale view window opens - */ - void - vScaleOpenAction(diagram_type *pDiag) - { - wimp_wstate tWindowState; - wimp_mousestr tMouseInfo; - int iMoveX, iMoveY; - - fail(pDiag == NULL); - - wimpt_noerr(wimp_get_wind_state(pDiag->tScaleWindow, &tWindowState)); - if ((tWindowState.flags & wimp_WOPEN) == wimp_WOPEN) { + Error_CheckFatal(Wimp_GetWindowState(pDiag->tScaleWindow, + &tWindowState)); + if (tWindowState.flags.data.open) { /* The window is already open */ - return; + return TRUE; } - DBG_MSG("vScaleOpenAction"); + DBG_MSG("vScaleOpenAction for real"); - /* Allow the window to move in relation to the mouse position */ - wimpt_noerr(wimp_get_point_info(&tMouseInfo)); - iMoveX = tMouseInfo.x - tWindowState.o.box.x0 + 24; - iMoveY = tMouseInfo.y - tWindowState.o.box.y1 + 20; - pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr; vUpdateWriteableNumber(pDiag->tScaleWindow, SCALE_SCALE_WRITEABLE, pDiag->iScaleFactorTemp); + Window_Show(pDiag->tScaleWindow, open_UNDERPOINTER); + return TRUE; + } /* end of bScaleOpenAction */ - tWindowState.o.box.x0 += iMoveX; - tWindowState.o.box.x1 += iMoveX; - tWindowState.o.box.y0 += iMoveY; - tWindowState.o.box.y1 += iMoveY; - tWindowState.o.behind = -1; - wimpt_noerr(wimp_open_wind(&tWindowState.o)); - } /* end of vScaleOpenAction */ - /* * vSetTitle - set the title of a window */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:920,925 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:918,925 { char szTitle[WINDOW_TITLE_LEN]; + TRACE_MSG("vSetTitle"); + fail(pDiag == NULL); fail(pDiag->szFilename[0] == '\0'); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:931,954 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:931,955 szTitle[FILENAME_TITLE_LEN - 1] = OUR_ELLIPSIS; } - win_settitle(pDiag->tMainWindow, szTitle); + Window_SetTitle(pDiag->tMainWindow, szTitle); } /* end of vSetTitle */ - /* * vScaleButtonClick - handle a mouse button click in the Scale view window */ - static void - vScaleButtonClick(wimp_mousestr *m, diagram_type *pDiag) + void + vScaleButtonClick(mouse_block *pMouse, diagram_type *pDiag) { BOOL bCloseWindow, bRedraw; - fail(m == NULL || pDiag == NULL); - fail(m->w != pDiag->tScaleWindow); + TRACE_MSG("vScaleButtonClick"); + fail(pMouse == NULL || pDiag == NULL); + fail(pMouse->window != pDiag->tScaleWindow); + bCloseWindow = FALSE; bRedraw = FALSE; - switch (m->i) { + switch (pMouse->icon) { case SCALE_CANCEL_BUTTON: bCloseWindow = TRUE; pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:971,982 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:972,983 pDiag->iScaleFactorTemp = 150; break; default: - DBG_DEC(m->i); + DBG_DEC(pMouse->icon); break; } if (bCloseWindow) { /* Close the scale window */ - wimpt_noerr(wimp_close_wind(m->w)); + Error_CheckFatal(Wimp_CloseWindow(pMouse->window)); if (bRedraw) { /* Redraw the main window */ vSetTitle(pDiag); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:983,1021 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:984,1030 vForceRedraw(pDiag); } } else { - vUpdateWriteableNumber(m->w, + vUpdateWriteableNumber(pMouse->window, SCALE_SCALE_WRITEABLE, pDiag->iScaleFactorTemp); } } /* end of vScaleButtonClick */ - static void - vScaleKeyPressed(int chcode, wimp_caretstr *c, diagram_type *pDiag) + /* + * bScaleKeyPressed - handle pressed keys for the scale window + */ + BOOL + bScaleKeyPressed(event_pollblock *pEvent, void *pvReference) { - wimp_icon tIcon; + icon_block tIcon; + diagram_type *pDiag; + caret_block *pCaret; char *pcChar; int iTmp; - DBG_MSG("vScaleKeyPressed"); + TRACE_MSG("bScaleKeyPressed"); - fail(c == NULL || pDiag == NULL); - fail(c->w != pDiag->tScaleWindow); + fail(pEvent == NULL); + fail(pEvent->type != event_KEY); + fail(pvReference == NULL); - DBG_DEC_C(c->i != SCALE_SCALE_WRITEABLE, c->i); - DBG_DEC_C(c->i == SCALE_SCALE_WRITEABLE, chcode); + pCaret = &pEvent->data.key.caret; + pDiag = (diagram_type *)pvReference; - if (chcode != '\r' || - c->w != pDiag->tScaleWindow || - c->i != SCALE_SCALE_WRITEABLE) { - wimpt_noerr(wimp_processkey(chcode)); - return; + fail(pEvent->data.key.caret.window != pDiag->tScaleWindow); + + DBG_DEC_C(pCaret->icon != SCALE_SCALE_WRITEABLE, pCaret->icon); + DBG_DEC_C(pCaret->icon == SCALE_SCALE_WRITEABLE, pEvent->data.key.code); + + if (pEvent->data.key.code != '\r' || + pCaret->icon != SCALE_SCALE_WRITEABLE) { + Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code)); + return TRUE; } - wimpt_noerr(wimp_get_icon_info(c->w, c->i, &tIcon)); - if ((tIcon.flags & (wimp_ITEXT|wimp_INDIRECT)) != - (wimp_ITEXT|wimp_INDIRECT)) { - werr(1, "Icon %d must be indirected text", (int)c->i); - return; + Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon)); + if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) { + werr(1, "Icon %d must be indirected text", (int)pCaret->icon); } iTmp = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10); if (*pcChar != '\0' && *pcChar != '\r') { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/draw.c:1029,1076 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/draw.c:1038,1047 } pDiag->iScaleFactorCurr = pDiag->iScaleFactorTemp; /* Close the scale window */ - wimpt_noerr(wimp_close_wind(c->w)); + Error_CheckFatal(Wimp_CloseWindow(pCaret->window)); /* Redraw the main window */ vSetTitle(pDiag); vForceRedraw(pDiag); - } /* end of vScaleKeyPressed */ + return TRUE; + } /* end of bScaleKeyPressed */ - /* - * vScaleEventHandler - event handler for the scale view screen - */ - void - vScaleEventHandler(wimp_eventstr *pEvent, void *pvHandle) - { - diagram_type *pDiag; - - DBG_MSG("vScaleEventHandler"); - - fail(pEvent == NULL); - - DBG_DEC(pEvent->e); - - pDiag = (diagram_type *)pvHandle; - - switch (pEvent->e) { - case wimp_ENULL: - break; - case wimp_EREDRAW: - /* handled by the WIMP */ - break; - case wimp_EOPEN: - wimpt_noerr(wimp_open_wind(&pEvent->data.o)); - break; - case wimp_ECLOSE: - wimpt_noerr(wimp_close_wind(pEvent->data.o.w)); - break; - case wimp_EBUT: - vScaleButtonClick(&pEvent->data.but.m, pDiag); - break; - case wimp_EKEY: - vScaleKeyPressed(pEvent->data.key.chcode, - &pEvent->data.key.c, pDiag); - break; - default: - break; - } - } /* end of vScaleEventHandler */ [jmk] --rw-rw-r-- M 499692 jmk sys 26682 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.c [jmk] --rw-rw-r-- M 499692 jmk sys 1012 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.h [jmk] --rw-rw-r-- M 499692 jmk sys 1012 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.h [jmk] --rw-rw-r-- M 499692 jmk sys 10881 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.c [jmk] --rw-rw-r-- M 499692 jmk sys 12215 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.h [jmk] --rw-rw-r-- M 499692 jmk sys 613 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.c [jmk] --rw-rw-r-- M 499692 jmk sys 613 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.c [jmk] --rw-rw-r-- M 499692 jmk sys 401 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.h [jmk] --rw-rw-r-- M 499692 jmk sys 401 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.h [jmk] --rw-rw-r-- M 499692 jmk sys 3797 Jan 14 12:57 sys/src/cmd/aux/antiword/finddata.c [jmk] --rw-rw-r-- M 499692 jmk sys 3797 Jan 14 12:57 sys/src/cmd/aux/antiword/finddata.c [jmk] --rw-rw-r-- M 499692 jmk sys 7321 Jan 14 12:57 sys/src/cmd/aux/antiword/findtext.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/findtext.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/findtext.c:1,6 /* * findtext.c - * Copyright (C) 1998-2001 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Find the blocks that contain the text of MS Word files /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/findtext.c:183,194 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/findtext.c:183,193 UCHAR *aucBuffer; ULONG ulTextOffset, ulBeginTextInfo; ULONG ulTotLength, ulLen; - ULONG ulTableStartBlock, ulTableSize; long lIndex, lPieces, lOff; size_t tTextInfoLen, tBlockDepotLen, tBlockSize; int iType, iLen; BOOL bUsesUnicode; - USHORT usDocStatus, usPropMod; + USHORT usPropMod; DBG_MSG("bGet8DocumentText"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/findtext.c:201,222 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/findtext.c:200,212 tTextInfoLen = (size_t)ulGetLong(0x1a6, aucHeader); /* lcbClx */ DBG_DEC(tTextInfoLen); - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_DEC(ulTableStartBlock); + DBG_DEC(pPPS->tTable.ulSB); + DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { return FALSE; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/findtext.c:228,234 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/findtext.c:218,224 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tTextInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginTextInfo, tTextInfoLen)) { aucBuffer = xfree(aucBuffer); [jmk] --rw-rw-r-- M 499692 jmk sys 7321 Jan 14 12:57 sys/src/cmd/aux/antiword/findtext.c [jmk] --rw-rw-r-- M 499692 jmk sys 3691 Jan 14 12:57 sys/src/cmd/aux/antiword/fmt_text.c [jmk] --rw-rw-r-- M 499692 jmk sys 126349 Jan 14 12:57 sys/src/cmd/aux/antiword/fontinfo.h [jmk] --rw-rw-r-- M 499692 jmk sys 126349 Jan 14 12:57 sys/src/cmd/aux/antiword/fontinfo.h [jmk] --rw-rw-r-- M 499692 jmk sys 4339 Jan 14 12:57 sys/src/cmd/aux/antiword/fontlist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:1,6 /* * fontlist.c - * Copyright (C) 1998-2002 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy a list of Word font information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:11,19 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:11,28 #include "antiword.h" + /* + * Private structure to hide the way the information + * is stored from the rest of the program + */ + typedef struct font_desc_tag { + font_block_type tInfo; + struct font_desc_tag *pNext; + } font_mem_type; + /* Variables needed to write the Font Information List */ - static font_desc_type *pAnchor = NULL; - static font_desc_type *pFontLast = NULL; + static font_mem_type *pAnchor = NULL; + static font_mem_type *pFontLast = NULL; /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:22,28 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:31,37 void vDestroyFontInfoList(void) { - font_desc_type *pCurr, *pNext; + font_mem_type *pCurr, *pNext; DBG_MSG("vDestroyFontInfoList"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:83,89 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:92,98 void vAdd2FontInfoList(const font_block_type *pFontBlock) { - font_desc_type *pListMember; + font_mem_type *pListMember; fail(pFontBlock == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:119,125 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:128,134 } /* Create list member */ - pListMember = xmalloc(sizeof(font_desc_type)); + pListMember = xmalloc(sizeof(font_mem_type)); /* Fill the list member */ pListMember->tInfo = *pFontBlock; pListMember->pNext = NULL; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:141,147 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:150,156 const font_block_type * pGetNextFontInfoListItem(const font_block_type *pCurr) { - const font_desc_type *pRecord; + const font_mem_type *pRecord; size_t tOffset; if (pCurr == NULL) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fontlist.c:152,160 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fontlist.c:161,169 /* The first record is the only one without a predecessor */ return &pAnchor->tInfo; } - tOffset = offsetof(font_desc_type, tInfo); + tOffset = offsetof(font_mem_type, tInfo); /* Many casts to prevent alignment warnings */ - pRecord = (font_desc_type *)(void *)((char *)pCurr - tOffset); + pRecord = (font_mem_type *)(void *)((char *)pCurr - tOffset); fail(pCurr != &pRecord->tInfo); if (pRecord->pNext == NULL) { /* The last record has no successor */ [jmk] --rw-rw-r-- M 499692 jmk sys 4339 Jan 14 12:57 sys/src/cmd/aux/antiword/fontlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 27501 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:1,6 /* * fonts.c - * Copyright (C) 1998-2002 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Functions to deal with fonts (generic) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:86,91 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:86,140 } /* end of iFontname2Fontnumber */ /* + * szGetDefaultFont - get the default font that matches the parameters + */ + static const char * + szGetDefaultFont(UCHAR ucFFN, int iEmphasis) + { + UCHAR ucPrq, ucFf; + + fail(iEmphasis < 0 || iEmphasis > 3); + + ucPrq = ucFFN & 0x03; + ucFf = (ucFFN & 0x70) >> 4; + NO_DBG_DEC(ucPrq); + NO_DBG_DEC(ucFf); + if (ucPrq == PITCH_FIXED) { + /* Set to the default monospaced font */ + switch (iEmphasis) { + case 1: return FONT_MONOSPACED_BOLD; + case 2: return FONT_MONOSPACED_ITALIC; + case 3: return FONT_MONOSPACED_BOLDITALIC; + default: return FONT_MONOSPACED_PLAIN; + } + } else if (ucFf == FAMILY_ROMAN) { + /* Set to the default serif font */ + switch (iEmphasis) { + case 1: return FONT_SERIF_BOLD; + case 2: return FONT_SERIF_ITALIC; + case 3: return FONT_SERIF_BOLDITALIC; + default: return FONT_SERIF_PLAIN; + } + } else if (ucFf == FAMILY_SWISS) { + /* Set to the default sans serif font */ + switch (iEmphasis) { + case 1: return FONT_SANS_SERIF_BOLD; + case 2: return FONT_SANS_SERIF_ITALIC; + case 3: return FONT_SANS_SERIF_BOLDITALIC; + default: return FONT_SANS_SERIF_PLAIN; + } + } else { + /* Set to the default default font */ + switch (iEmphasis) { + case 1: return FONT_SERIF_BOLD; + case 2: return FONT_SERIF_ITALIC; + case 3: return FONT_SERIF_BOLDITALIC; + default: return FONT_SERIF_PLAIN; + } + } + } /* end of szGetDefaultFont */ + + /* * See if the fontname from the Word file matches the fontname from the * font translation file. * If iBytesPerChar is one than aucWord is in ISO-8859-x (Word 2/6/7), /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:112,118 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:161,167 } /* end of bFontEqual */ /* - * + * vFontname2Table - add fontnames to the font table */ static void vFontname2Table(const UCHAR *aucFont, const UCHAR *aucAltFont, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:121,127 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:170,175 font_table_type *pFontTableRecord) { BOOL bMatchFound; - UCHAR ucPrq, ucFf; fail(aucFont == NULL || aucFont[0] == 0); fail(aucAltFont != NULL && aucAltFont[0] == 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:145,182 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:193,199 * szWordFont contains a "*", so szOurFont will contain the * "default default" font. See if we can do better than that. */ - ucPrq = ucFFN & 0x03; - ucFf = (ucFFN & 0x70) >> 4; - NO_DBG_DEC(ucPrq); - NO_DBG_DEC(ucFf); - if (ucPrq == PITCH_FIXED) { - /* Set to the default monospaced font */ - switch (iEmphasis) { - case 0: szOurFont = FONT_MONOSPACED_PLAIN; break; - case 1: szOurFont = FONT_MONOSPACED_BOLD; break; - case 2: szOurFont = FONT_MONOSPACED_ITALIC; break; - case 3: szOurFont = FONT_MONOSPACED_BOLDITALIC; break; - default: break; - } - } else if (ucFf == FAMILY_ROMAN) { - /* Set to the default serif font */ - switch (iEmphasis) { - case 0: szOurFont = FONT_SERIF_PLAIN; break; - case 1: szOurFont = FONT_SERIF_BOLD; break; - case 2: szOurFont = FONT_SERIF_ITALIC; break; - case 3: szOurFont = FONT_SERIF_BOLDITALIC; break; - default: break; - } - } else if (ucFf == FAMILY_SWISS) { - /* Set to the default sans serif font */ - switch (iEmphasis) { - case 0: szOurFont = FONT_SANS_SERIF_PLAIN; break; - case 1: szOurFont = FONT_SANS_SERIF_BOLD; break; - case 2: szOurFont = FONT_SANS_SERIF_ITALIC; break; - case 3: szOurFont = FONT_SANS_SERIF_BOLDITALIC; break; - default: break; - } - } + szOurFont = szGetDefaultFont(ucFFN, iEmphasis); bMatchFound = TRUE; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:205,210 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:222,229 sizeof(pFontTableRecord->szOurFontname) - 1] = '\0'; NO_DBG_MSG(pFontTableRecord->szWordFontname); NO_DBG_MSG(pFontTableRecord->szOurFontname); + pFontTableRecord->ucFFN = ucFFN; + pFontTableRecord->ucEmphasis = (UCHAR)iEmphasis; } } /* end of vFontname2Table */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:270,275 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:289,297 return; } + /* See if we must add a font for our tables */ + bMustAddTableFont = TRUE; + #if 0 DBG_MSG("Before"); DBG_DEC(tFontTableRecords); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:283,295 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:305,316 } #endif /* DEBUG */ + /* See which fonts/styles we really need */ + /* Default font/style is by definition in use */ pFontTable[0].ucInUse = 1; - /* See which fonts/styles are really being used */ - bMustAddTableFont = TRUE; - - /* The fonts/styles that will be used */ + /* Make InUse 1 for all the fonts/styles that WILL be used */ pFont = NULL; while((pFont = pGetNextFontInfoListItem(pFont)) != NULL) { pTmp = pFontTable + 4 * (int)pFont->ucFontNumber; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:309,315 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:330,336 pTmp->ucInUse = 1; } - /* The fonts/styles that might be used */ + /* Make InUse 1 for all the fonts/styles that MIGHT be used */ pStyle = NULL; while((pStyle = pGetNextStyleInfoListItem(pStyle)) != NULL) { vFillFontFromStylesheet(pStyle->usIstdNext, &tFontNext); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:345,355 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:366,378 *(pTmp - iUnUsed) = *pTmp; } } + fail(iUnUsed < 0); + fail(tFontTableRecords <= (size_t)iUnUsed); tFontTableRecords -= (size_t)iUnUsed; - fail(tFontTableRecords == 0); if (bMustAddTableFont) { pTmp = pFontTable + tFontTableRecords; + fail(pTmp <= pFontTable); pTmp->ucWordFontNumber = (pTmp - 1)->ucWordFontNumber + 1; pTmp->usFontStyle = FONT_REGULAR; pTmp->ucInUse = 1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:460,465 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:483,491 vCreateFontTable(); /* Read the font translation file */ + iItalic = 0; + iBold = 0; + iSpecial = 0; while (bReadFontFile(pFontTableFile, szWordFont, &iItalic, &iBold, szOurFont, &iSpecial)) { iEmphasis = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:494,500 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:520,526 * vCreate2FontTable - create a font table from WinWord 1/2 */ void - vCreate2FontTable(FILE *pFile, const UCHAR *aucHeader) + vCreate2FontTable(FILE *pFile, int iWordVersion, const UCHAR *aucHeader) { FILE *pFontTableFile; font_table_type *pTmp; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:502,513 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:528,540 UCHAR *aucBuffer; ULONG ulBeginFontInfo; size_t tFontInfoLen; - int iPos, iRecLen; + int iPos, iOff, iRecLen; int iBold, iItalic, iSpecial, iEmphasis; UCHAR ucFFN; char szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH]; fail(pFile == NULL || aucHeader == NULL); + fail(iWordVersion != 1 && iWordVersion != 2); tFontTableRecords = 0; pFontTable = xfree(pFontTable); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:522,532 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:549,558 DBG_HEX(ulBeginFontInfo); tFontInfoLen = (size_t)usGetWord(0xb6, aucHeader); /* cbSttbfffn */ DBG_DEC(tFontInfoLen); - fail(tFontInfoLen < 6); - if (ulBeginFontInfo > (ULONG)LONG_MAX) { + if (ulBeginFontInfo > (ULONG)LONG_MAX || tFontInfoLen == 0) { /* Don't ask me why this is needed */ - DBG_HEX(ulBeginFontInfo); + DBG_HEX_C(tFontInfoLen != 0, ulBeginFontInfo); (void)fclose(pFontTableFile); return; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:541,560 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:567,640 DBG_DEC(usGetWord(0, aucBuffer)); /* Compute the maximum number of entries in the font table */ - tFontTableRecords = 0; + if (iWordVersion == 1) { + fail(tFontInfoLen < 2); + /* WinWord 1 has three implicit fonts */ + tFontTableRecords = 3; + iOff = 2; + } else { + fail(tFontInfoLen < 6); + /* WinWord 2 and up have no implicit fonts */ + tFontTableRecords = 0; + iOff = 3; + } iPos = 2; - while (iPos + 3 < (int)tFontInfoLen) { + while (iPos + iOff < (int)tFontInfoLen) { iRecLen = (int)ucGetByte(iPos, aucBuffer); NO_DBG_DEC(iRecLen); - NO_DBG_MSG(aucBuffer + iPos + 3); + NO_DBG_MSG(aucBuffer + iPos + iOff); iPos += iRecLen + 1; tFontTableRecords++; } - tFontTableRecords *= 4; /* Plain, Bold, Italic and Bold/italic */ + tFontTableRecords *= 4; /* Plain, Bold, Italic and Bold/Italic */ tFontTableRecords++; /* One extra for the table-font */ vCreateFontTable(); + /* Add the tree implicit fonts (in four variations) */ + if (iWordVersion == 1) { + fail(tFontTableRecords < 13); + vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 0, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Roman", pFontTable + 0); + vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 1, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Bold", pFontTable + 1); + vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 2, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Italic", pFontTable + 2); + vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 3, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-BoldItalic", pFontTable + 3); + vFontname2Table((UCHAR *)"Symbol", NULL, 1, 0, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Roman", pFontTable + 4); + vFontname2Table((UCHAR *)"Symbol", NULL, 1, 1, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Bold", pFontTable + 5); + vFontname2Table((UCHAR *)"Symbol", NULL, 1, 2, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-Italic", pFontTable + 6); + vFontname2Table((UCHAR *)"Symbol", NULL, 1, 3, + (UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE), + "*", "Times-BoldItalic", pFontTable + 7); + vFontname2Table((UCHAR *)"Helv", NULL, 1, 0, + (UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE), + "*", "Helvetica", pFontTable + 8); + vFontname2Table((UCHAR *)"Helv", NULL, 1, 1, + (UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE), + "*", "Helvetica-Bold", pFontTable + 9); + vFontname2Table((UCHAR *)"Helv", NULL, 1, 2, + (UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE), + "*", "Helvetica-Oblique", pFontTable + 10); + vFontname2Table((UCHAR *)"Helv", NULL, 1, 3, + (UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE), + "*", "Helvetica-BoldOblique", pFontTable + 11); + } + /* Read the font translation file */ + iItalic = 0; + iBold = 0; + iSpecial = 0; while (bReadFontFile(pFontTableFile, szWordFont, &iItalic, &iBold, szOurFont, &iSpecial)) { iEmphasis = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:566,575 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:646,655 } pTmp = pFontTable + iEmphasis; iPos = 2; - while (iPos + 3 < (int)tFontInfoLen) { + while (iPos + iOff < (int)tFontInfoLen) { iRecLen = (int)ucGetByte(iPos, aucBuffer); ucFFN = ucGetByte(iPos + 1, aucBuffer); - aucFont = aucBuffer + iPos + 3; + aucFont = aucBuffer + iPos + iOff; vFontname2Table(aucFont, NULL, 1, iEmphasis, ucFFN, szWordFont, szOurFont, pTmp); pTmp += 4; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:647,652 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:727,735 vCreateFontTable(); /* Read the font translation file */ + iItalic = 0; + iBold = 0; + iSpecial = 0; while (bReadFontFile(pFontTableFile, szWordFont, &iItalic, &iBold, szOurFont, &iSpecial)) { iEmphasis = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:696,706 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:779,787 UCHAR *aucFont, *aucAltFont; UCHAR *aucBuffer; ULONG ulBeginFontInfo; - ULONG ulTableSize, ulTableStartBlock; size_t tFontInfoLen, tBlockDepotLen, tBlockSize; int iPos, iRecLen, iOffsetAltName; int iBold, iItalic, iSpecial, iEmphasis; - USHORT usDocStatus; UCHAR ucFFN; char szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:722,745 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:803,817 DBG_DEC(tFontInfoLen); fail(tFontInfoLen < 46); - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_DEC(ulTableStartBlock); + DBG_DEC(pPPS->tTable.ulSB); + DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { DBG_MSG("No fontname table"); (void)fclose(pFontTableFile); return; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:751,757 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:823,829 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tFontInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginFontInfo, tFontInfoLen)) { aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:767,772 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:839,847 vCreateFontTable(); /* Read the font translation file */ + iItalic = 0; + iBold = 0; + iSpecial = 0; while (bReadFontFile(pFontTableFile, szWordFont, &iItalic, &iBold, szOurFont, &iSpecial)) { iEmphasis = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:821,837 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:896,920 const font_table_type * pGetNextFontTableRecord(const font_table_type *pRecordCurr) { - int iIndexCurr; + size_t tIndexCurr; if (pRecordCurr == NULL) { - /* No current record, so start with the first */ + /* No current record, so start with the first one */ return &pFontTable[0]; } - iIndexCurr = pRecordCurr - pFontTable; - if (iIndexCurr + 1 < (int)tFontTableRecords) { + if (pRecordCurr < pFontTable || + pRecordCurr >= pFontTable + tFontTableRecords) { + /* Not a pointer in the array */ + DBG_HEX(pRecordCurr); + DBG_HEX(pFontTable); + return NULL; + } + + tIndexCurr = (size_t)(pRecordCurr - pFontTable); + if (tIndexCurr + 1 < tFontTableRecords) { /* There is a next record, so return it */ - return &pFontTable[iIndexCurr + 1]; + return &pFontTable[tIndexCurr + 1]; } /* There is no next record */ return NULL; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts.c:847,849 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts.c:930,1018 { return tFontTableRecords; } /* end of tGetFontTableLength */ + + #if !defined(__riscos) + /* + * vCorrect4PDF - only include PDF default fonts + */ + static void + vCorrect4PDF(void) + { + font_table_type *pTmp; + const char *szOurFont; + + for (pTmp = pFontTable; pTmp < pFontTable + tFontTableRecords; pTmp++) { + if (STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_PLAIN) || + STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_BOLD) || + STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_ITALIC) || + STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_BOLDITALIC) || + STRCEQ(pTmp->szOurFontname, FONT_SERIF_PLAIN) || + STRCEQ(pTmp->szOurFontname, FONT_SERIF_BOLD) || + STRCEQ(pTmp->szOurFontname, FONT_SERIF_ITALIC) || + STRCEQ(pTmp->szOurFontname, FONT_SERIF_BOLDITALIC) || + STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_PLAIN) || + STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_BOLD) || + STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_ITALIC) || + STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_BOLDITALIC)) { + /* Already a default font */ + continue; + } + szOurFont = + szGetDefaultFont(pTmp->ucFFN, (int)pTmp->ucEmphasis); + (void)strncpy(pTmp->szOurFontname, szOurFont, + sizeof(pTmp->szOurFontname) - 1); + pTmp->szOurFontname[sizeof(pTmp->szOurFontname) - 1] = '\0'; + } + } /* end of vCorrect4PDF */ + + /* + * vCorrect4CyrPS - only include monospaced fonts + */ + static void + vCorrect4CyrPS(void) + { + font_table_type *pTmp; + const char *szOurFont; + UCHAR ucFFN; + + ucFFN = (FAMILY_UNKNOWN << 4) | PITCH_FIXED; + for (pTmp = pFontTable; pTmp < pFontTable + tFontTableRecords; pTmp++) { + szOurFont = szGetDefaultFont(ucFFN, (int)pTmp->ucEmphasis); + (void)strncpy(pTmp->szOurFontname, szOurFont, + sizeof(pTmp->szOurFontname) - 1); + pTmp->szOurFontname[sizeof(pTmp->szOurFontname) - 1] = '\0'; + } + } /* end of vCorrect4CyrPS */ + #endif /* __riscos */ + + /* + * vCorrectFontTable - correct the font table in special cases + */ + void + vCorrectFontTable(conversion_type eConversionType, encoding_type eEncoding) + { + #if !defined(__riscos) + if (eConversionType == conversion_pdf) { + vCorrect4PDF(); + } + if (eConversionType == conversion_ps && + eEncoding == encoding_cyrillic) { + vCorrect4CyrPS(); + } + #endif /* __riscos */ + } /* end of vCorrectFontTable */ + + /* + * lComputeSpaceWidth - compute the width of a space character + * + * Returns the space width in millipoints + */ + long + lComputeSpaceWidth(drawfile_fontref tFontRef, USHORT usFontSize) + { + char szSpace[] = " "; + + fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); + + return lComputeStringWidth(szSpace, 1, tFontRef, usFontSize); + } /* end of lComputeSpaceWidth */ [jmk] --rw-rw-r-- M 499692 jmk sys 27501 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts.c [jmk] --rw-rw-r-- M 499692 jmk sys 5843 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_r.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:8,16 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:8,18 #include #include + #include "DeskLib:Font.h" + #include "drawfile.h" #include "antiword.h" - static font tFontCurr = (font)-1; + static font_handle tFontCurr = (font_handle)-1; /* * pOpenFontTableFile - open the Font translation file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:97,110 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:99,112 NO_DBG_MSG("vCloseFont"); - if (tFontCurr == (font)-1) { + if (tFontCurr == (font_handle)-1) { return; } - e = font_lose(tFontCurr); + e = Font_LoseFont(tFontCurr); if (e != NULL) { werr(0, "Close font error %d: %s", e->errnum, e->errmess); } - tFontCurr = -1; + tFontCurr = (font_handle)-1; } /* end of vCloseFont */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:112,123 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:114,125 * * Returns the font reference number for use in a draw file */ - draw_fontref + drawfile_fontref tOpenFont(UCHAR ucWordFontNumber, USHORT usFontStyle, USHORT usWordFontSize) { os_error *e; const char *szOurFontname; - font tFont; + font_handle tFont; int iFontnumber; NO_DBG_MSG("tOpenFont"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:132,144 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:134,146 iFontnumber = iGetFontByNumber(ucWordFontNumber, usFontStyle); szOurFontname = szGetOurFontname(iFontnumber); if (szOurFontname == NULL || szOurFontname[0] == '\0') { - tFontCurr = (font)-1; - return (draw_fontref)0; + tFontCurr = (font_handle)-1; + return (byte)0; } NO_DBG_MSG(szOurFontname); - e = font_find((char *)szOurFontname, + e = Font_FindFont(&tFont, (char *)szOurFontname, (int)usWordFontSize * 8, (int)usWordFontSize * 8, - 0, 0, &tFont); + 0, 0); if (e != NULL) { switch (e->errnum) { case 523: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:149,160 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:151,162 e->errnum, e->errmess); break; } - tFontCurr = (font)-1; - return (draw_fontref)0; + tFontCurr = (font_handle)-1; + return (drawfile_fontref)0; } tFontCurr = tFont; NO_DBG_DEC(tFontCurr); - return (draw_fontref)(iFontnumber + 1); + return (drawfile_fontref)(iFontnumber + 1); } /* end of tOpenFont */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:162,168 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:164,170 * * Returns the font reference number for use in a draw file */ - draw_fontref + drawfile_fontref tOpenTableFont(USHORT usWordFontSize) { int iWordFontnumber; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:172,179 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:174,181 iWordFontnumber = iFontname2Fontnumber(TABLE_FONT, FONT_REGULAR); if (iWordFontnumber < 0 || iWordFontnumber > (int)UCHAR_MAX) { DBG_DEC(iWordFontnumber); - tFontCurr = (font)-1; - return (draw_fontref)0; + tFontCurr = (font_handle)-1; + return (drawfile_fontref)0; } return tOpenFont((UCHAR)iWordFontnumber, FONT_REGULAR, usWordFontSize); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:186,192 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:188,194 */ long lComputeStringWidth(const char *szString, size_t tStringLength, - draw_fontref tFontRef, USHORT usFontSize) + drawfile_fontref tFontRef, USHORT usFontSize) { font_string tStr; os_error *e; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:202,208 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:204,210 /* Font_strwidth doesn't like control characters */ return 0; } - if (tFontCurr == (font)-1) { + if (tFontCurr == (font_handle)-1) { /* No current font, use systemfont */ return lChar2MilliPoints(tStringLength); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_r.c:211,217 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_r.c:213,219 tStr.y = INT_MAX; tStr.split = -1; tStr.term = tStringLength; - e = font_strwidth(&tStr); + e = Font_StringWidth(&tStr); if (e == NULL) { return (long)tStr.x; } [jmk] --rw-rw-r-- M 499692 jmk sys 5843 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_r.c [jmk] --rw-rw-r-- M 499692 jmk sys 7542 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_u.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:1,6 /* * fonts_u.c - * Copyright (C) 1999-2002 A.J. van Os; Released under GPL + * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL * * Description: * Functions to deal with fonts (Unix version) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:27,37 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:27,39 pOpenFontTableFile(void) { FILE *pFile; - const char *szHome, *szAntiword; - const char *szGlobalFile; + const char *szHome, *szAntiword, *szGlobalFile; char szEnvironmentFile[PATH_MAX+1]; char szLocalFile[PATH_MAX+1]; + szEnvironmentFile[0] = '\0'; + szLocalFile[0] = '\0'; + /* Try the environment version of the fontnames file */ szAntiword = szGetAntiwordDirectory(); if (szAntiword != NULL && szAntiword[0] != '\0') { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:47,53 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:49,55 FILE_SEPARATOR FONTNAMES_FILE); DBG_MSG(szEnvironmentFile); - pFile = fopen(szLocalFile, "r"); + pFile = fopen(szEnvironmentFile, "r"); if (pFile != NULL) { return pFile; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:81,90 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:83,100 return pFile; } - werr(0, "I can not open your fontnames file.\n" - "Neither '%s' nor\n" - "'%s' can be opened for reading.", - szLocalFile, szGlobalFile); + if (szEnvironmentFile[0] != '\0') { + werr(0, "I can not open your fontnames file.\n" + "Neither '%s' nor\n" + "'%s' nor\n" + "'%s' can be opened for reading.", + szEnvironmentFile, szLocalFile, szGlobalFile); + } else { + werr(0, "I can not open your fontnames file.\n" + "Neither '%s' nor\n" + "'%s' can be opened for reading.", + szLocalFile, szGlobalFile); + } return NULL; } /* end of pOpenFontTableFile */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:96,103 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:106,113 { NO_DBG_MSG("vCloseFont"); /* For safety: to be overwritten at the next call of tOpenfont() */ - bUsePlainText = TRUE; eEncoding = encoding_neutral; + bUsePlainText = TRUE; } /* end of vCloseFont */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:105,116 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:115,127 * * Returns the font reference number */ - draw_fontref + drawfile_fontref tOpenFont(UCHAR ucWordFontNumber, USHORT usFontStyle, USHORT usWordFontSize) { options_type tOptions; const char *szOurFontname; - int iIndex, iFontnumber; + size_t tIndex; + int iFontnumber; NO_DBG_MSG("tOpenFont"); NO_DBG_DEC(ucWordFontNumber); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:122,134 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:133,146 NO_DBG_HEX(usFontStyle); vGetOptions(&tOptions); - bUsePlainText = tOptions.eConversionType != conversion_draw && - tOptions.eConversionType != conversion_ps; eEncoding = tOptions.eEncoding; + bUsePlainText = tOptions.eConversionType != conversion_draw && + tOptions.eConversionType != conversion_ps && + tOptions.eConversionType != conversion_pdf; if (bUsePlainText) { /* Plain text, no fonts */ - return (draw_fontref)0; + return (drawfile_fontref)0; } iFontnumber = iGetFontByNumber(ucWordFontNumber, usFontStyle); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:135,151 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:147,163 szOurFontname = szGetOurFontname(iFontnumber); if (szOurFontname == NULL || szOurFontname[0] == '\0') { DBG_DEC(iFontnumber); - return (draw_fontref)0; + return (drawfile_fontref)0; } NO_DBG_MSG(szOurFontname); - for (iIndex = 0; iIndex < (int)elementsof(szFontnames); iIndex++) { - if (STREQ(szFontnames[iIndex], szOurFontname)) { - NO_DBG_DEC(iIndex); - return (draw_fontref)iIndex; + for (tIndex = 0; tIndex < elementsof(szFontnames); tIndex++) { + if (STREQ(szFontnames[tIndex], szOurFontname)) { + NO_DBG_DEC(tIndex); + return (drawfile_fontref)tIndex; } } - return (draw_fontref)0; + return (drawfile_fontref)0; } /* end of tOpenFont */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:153,159 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:165,171 * * Returns the font reference number */ - draw_fontref + drawfile_fontref tOpenTableFont(USHORT usWordFontSize) { options_type tOptions; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:162,180 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:174,193 NO_DBG_MSG("tOpenTableFont"); vGetOptions(&tOptions); - bUsePlainText = tOptions.eConversionType != conversion_draw && - tOptions.eConversionType != conversion_ps; eEncoding = tOptions.eEncoding; + bUsePlainText = tOptions.eConversionType != conversion_draw && + tOptions.eConversionType != conversion_ps && + tOptions.eConversionType != conversion_pdf; if (bUsePlainText) { /* Plain text, no fonts */ - return (draw_fontref)0; + return (drawfile_fontref)0; } iWordFontnumber = iFontname2Fontnumber(TABLE_FONT, FONT_REGULAR); if (iWordFontnumber < 0 || iWordFontnumber > (int)UCHAR_MAX) { DBG_DEC(iWordFontnumber); - return (draw_fontref)0; + return (drawfile_fontref)0; } return tOpenFont((UCHAR)iWordFontnumber, FONT_REGULAR, usWordFontSize); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:184,190 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:197,203 * szGetFontname - get the fontname */ const char * - szGetFontname(draw_fontref tFontRef) + szGetFontname(drawfile_fontref tFontRef) { fail((size_t)(UCHAR)tFontRef >= elementsof(szFontnames)); return szFontnames[(int)(UCHAR)tFontRef]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:200,206 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:213,219 */ long lComputeStringWidth(const char *szString, size_t tStringLength, - draw_fontref tFontRef, USHORT usFontSize) + drawfile_fontref tFontRef, USHORT usFontSize) { USHORT *ausCharWidths; UCHAR *pucChar; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:216,222 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:229,235 return 0; } - if (eEncoding == encoding_utf8) { + if (eEncoding == encoding_utf_8) { fail(!bUsePlainText); return lChar2MilliPoints( utf8_strwidth(szString, tStringLength)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:227,240 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:240,258 return lChar2MilliPoints(tStringLength); } - DBG_DEC_C(eEncoding != encoding_iso_8859_1 && - eEncoding != encoding_iso_8859_2, eEncoding); - fail(eEncoding != encoding_iso_8859_1 && - eEncoding != encoding_iso_8859_2); + if (eEncoding == encoding_cyrillic) { + /* FIXME: until the character tables are available */ + return (tStringLength * 600L * (long)usFontSize + 1) / 2; + } + DBG_DEC_C(eEncoding != encoding_latin_1 && + eEncoding != encoding_latin_2, eEncoding); + fail(eEncoding != encoding_latin_1 && + eEncoding != encoding_latin_2); + /* Compute the relative string width */ iFontRef = (int)(UCHAR)tFontRef; - if (eEncoding == encoding_iso_8859_2) { + if (eEncoding == encoding_latin_2) { ausCharWidths = ausCharacterWidths2[iFontRef]; } else { ausCharWidths = ausCharacterWidths1[iFontRef]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:247,253 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:265,271 } /* Compute the absolute string width */ - return (lRelWidth * usFontSize + 1) / 2; + return (lRelWidth * (long)usFontSize + 1) / 2; } /* end of lComputeStringWidth */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:263,269 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:281,287 { fail(szString == NULL); - if (eEncoding != encoding_utf8) { + if (eEncoding != encoding_utf_8) { /* One byte, one character, one column */ return tLength; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/fonts_u.c:280,286 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/fonts_u.c:298,304 { fail(szString == NULL); - if (eEncoding != encoding_utf8) { + if (eEncoding != encoding_utf_8) { return 1; } return (size_t)utf8_chrlength(szString); [jmk] --rw-rw-r-- M 499692 jmk sys 7542 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 9314 Jan 14 12:57 sys/src/cmd/aux/antiword/hdrftrlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 2504 Jan 14 12:57 sys/src/cmd/aux/antiword/icons.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/icons.c:7,45 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/icons.c:7,46 */ #include - #include "wimpt.h" + #include "DeskLib:Error.h" + #include "DeskLib:WimpSWIs.h" #include "antiword.h" void - vUpdateIcon(wimp_w tWindow, wimp_icon *pIcon) + vUpdateIcon(window_handle tWindow, icon_block *pIcon) { - wimp_redrawstr r; + window_redrawblock tRedraw; BOOL bMore; - r.w = tWindow; - r.box = pIcon->box; - wimpt_noerr(wimp_update_wind(&r, &bMore)); + tRedraw.window = tWindow; + tRedraw.rect = pIcon->workarearect; + Error_CheckFatal(Wimp_UpdateWindow(&tRedraw, &bMore)); while (bMore) { - (void)wimp_ploticon(pIcon); - wimpt_noerr(wimp_get_rectangle(&r, &bMore)); + Error_CheckFatal(Wimp_PlotIcon(pIcon)); + Error_CheckFatal(Wimp_GetRectangle(&tRedraw, &bMore)); } } /* end of vUpdateIcon */ void - vUpdateRadioButton(wimp_w tWindow, wimp_i tIconNumber, BOOL bSelected) + vUpdateRadioButton(window_handle tWindow, icon_handle tIconNumber, + BOOL bSelected) { - wimp_icon tIcon; + icon_block tIcon; - wimpt_noerr(wimp_get_icon_info(tWindow, tIconNumber, &tIcon)); + Error_CheckFatal(Wimp_GetIconState(tWindow, tIconNumber, &tIcon)); DBG_DEC(tIconNumber); - DBG_HEX(tIcon.flags); - if (bSelected == - ((tIcon.flags & wimp_ISELECTED) == wimp_ISELECTED)) { + DBG_HEX(tIcon.flags.data.selected); + if (bSelected == (tIcon.flags.data.selected == 1)) { /* No update needed */ return; } - wimpt_noerr(wimp_set_icon_state(tWindow, tIconNumber, - bSelected ? wimp_ISELECTED : 0, wimp_ISELECTED)); + Error_CheckFatal(Wimp_SetIconState(tWindow, tIconNumber, + bSelected ? 0x00200000 : 0, 0x00200000)); vUpdateIcon(tWindow, &tIcon); } /* end of vUpdateRadioButton */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/icons.c:47,56 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/icons.c:48,58 * vUpdateWriteable - update a writeable icon with a string */ void - vUpdateWriteable(wimp_w tWindow, wimp_i tIconNumber, char *szString) + vUpdateWriteable(window_handle tWindow, icon_handle tIconNumber, + const char *szString) { - wimp_icon tIcon; - wimp_caretstr tCaret; + icon_block tIcon; + caret_block tCaret; int iLen; fail(szString == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/icons.c:58,67 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/icons.c:60,68 NO_DBG_DEC(tIconNumber); NO_DBG_MSG(szString); - wimpt_noerr(wimp_get_icon_info(tWindow, tIconNumber, &tIcon)); + Error_CheckFatal(Wimp_GetIconState(tWindow, tIconNumber, &tIcon)); NO_DBG_HEX(tIcon.flags); - if ((tIcon.flags & (wimp_ITEXT|wimp_INDIRECT)) != - (wimp_ITEXT|wimp_INDIRECT)) { + if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) { werr(1, "Icon %d must be indirected text", (int)tIconNumber); return; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/icons.c:69,83 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/icons.c:70,84 szString, tIcon.data.indirecttext.bufflen - 1); /* Ensure the caret is behind the last character of the text */ - wimpt_noerr(wimp_get_caret_pos(&tCaret)); - if (tCaret.w == tWindow && tCaret.i == tIconNumber) { + Error_CheckFatal(Wimp_GetCaretPosition(&tCaret)); + if (tCaret.window == tWindow && tCaret.icon == tIconNumber) { iLen = strlen(tIcon.data.indirecttext.buffer); if (tCaret.index != iLen) { tCaret.index = iLen; - wimpt_noerr(wimp_set_caret_pos(&tCaret)); + Error_CheckFatal(Wimp_SetCaretPosition(&tCaret)); } } - wimpt_noerr(wimp_set_icon_state(tWindow, tIconNumber, 0,0)); + Error_CheckFatal(Wimp_SetIconState(tWindow, tIconNumber, 0, 0)); vUpdateIcon(tWindow, &tIcon); } /* end of vUpdateWriteable */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/icons.c:85,93 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/icons.c:86,95 * vUpdateWriteableNumber - update a writeable icon with a number */ void - vUpdateWriteableNumber(wimp_w tWindow, wimp_i tIconNumber, int iNumber) + vUpdateWriteableNumber(window_handle tWindow, icon_handle tIconNumber, + int iNumber) { - char szTmp[12]; + char szTmp[1+3*sizeof(int)+1]; (void)sprintf(szTmp, "%d", iNumber); vUpdateWriteable(tWindow, tIconNumber, szTmp); [jmk] --rw-rw-r-- M 499692 jmk sys 2504 Jan 14 12:57 sys/src/cmd/aux/antiword/icons.c [jmk] --rw-rw-r-- M 499692 jmk sys 26488 Jan 14 12:57 sys/src/cmd/aux/antiword/imgexam.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:1,6 /* * imgexam.c - * Copyright (C) 2000-2003 A.J. van Os; Released under GPL + * Copyright (C) 2000-2004 A.J. van Os; Released under GNU GPL * * Description: * Functions to examine image headers /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:28,33 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:28,41 #define PNG_CB_COLOR 0x02 #define PNG_CB_ALPHA 0x04 + /* Instance signature */ + #define MSOBI_WMF 0x0216 + #define MSOBI_EMF 0x03d4 + #define MSOBI_PICT 0x0542 + #define MSOBI_PNG 0x06e0 + #define MSOBI_JPEG 0x046a + #define MSOBI_DIB 0x07a8 + /* The following enum is stolen from the IJG JPEG library */ typedef enum { /* JPEG marker codes */ M_SOF0 = 0xc0, /* baseline DCT */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:687,693 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:695,701 imagetype_enum *peImageType) { ULONG ulMarker; - size_t tElementLen, tToSkip; + size_t tRecordLength, tToSkip; USHORT usMarker; fail(pFile == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:717,726 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:725,734 tPosition += 18; while (tPosition + 6 <= tLength) { - tElementLen = (size_t)ulNextLong(pFile); + tRecordLength = (size_t)ulNextLong(pFile); usMarker = usNextWord(pFile); tPosition += 6; - NO_DBG_DEC(tElementLen); + NO_DBG_DEC(tRecordLength); NO_DBG_HEX(usMarker); switch (usMarker) { case 0x0000: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:737,756 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:745,764 tPosition += tSkipBytes(pFile, 22); return tPosition; default: - if (tElementLen < 3) { + if (tRecordLength < 3) { break; } - if (tElementLen > SIZE_T_MAX / 2) { + if (tRecordLength > SIZE_T_MAX / 2) { /* * No need to compute the number of bytes * to skip */ - DBG_DEC(tElementLen); - DBG_HEX(tElementLen); + DBG_DEC(tRecordLength); + DBG_HEX(tRecordLength); DBG_FIXME(); return (size_t)-1; } - tToSkip = tElementLen * 2 - 6; + tToSkip = tRecordLength * 2 - 6; if (tToSkip > tLength - tPosition) { /* You can't skip this number of bytes */ DBG_DEC(tToSkip); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:776,783 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:784,792 tFind8Image(FILE *pFile, size_t tPosition, size_t tLength, imagetype_enum *peImageType) { - size_t tElementLen, tNameLen; - USHORT usID, usElementTag; + size_t tRecordLength, tNameLen; + USHORT usRecordVersion, usRecordType, usRecordInstance; + USHORT usTmp; fail(pFile == NULL); fail(peImageType == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:784,797 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:793,809 *peImageType = imagetype_is_unknown; while (tPosition + 8 <= tLength) { - usID = usNextWord(pFile) >> 4; - usElementTag = usNextWord(pFile); - tElementLen = (size_t)ulNextLong(pFile); + usTmp = usNextWord(pFile); + usRecordVersion = usTmp & 0x000f; + usRecordInstance = usTmp >> 4; + usRecordType = usNextWord(pFile); + tRecordLength = (size_t)ulNextLong(pFile); tPosition += 8; - NO_DBG_HEX(usID); - NO_DBG_HEX(usElementTag); - NO_DBG_DEC(tElementLen); - switch (usElementTag) { + NO_DBG_HEX(usRecordVersion); + NO_DBG_HEX(usRecordInstance); + NO_DBG_HEX(usRecordType); + NO_DBG_DEC(tRecordLength); + switch (usRecordType) { case 0xf000: case 0xf001: case 0xf002: case 0xf003: case 0xf004: case 0xf005: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/imgexam.c:811,853 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/imgexam.c:823,883 case 0xf006: case 0xf00a: case 0xf00b: case 0xf00d: case 0xf00e: case 0xf00f: case 0xf010: case 0xf011: case 0xf122: - tPosition += tSkipBytes(pFile, tElementLen); + tPosition += tSkipBytes(pFile, tRecordLength); break; case 0xf01a: DBG_MSG("EMF"); *peImageType = imagetype_is_emf; - tPosition += tSkipBytes(pFile, usID == 0x3d4 ? 50 : 66); + tPosition += tSkipBytes(pFile, 50); + if ((usRecordInstance ^ MSOBI_EMF) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf01b: DBG_MSG("WMF"); *peImageType = imagetype_is_wmf; - tPosition += tSkipBytes(pFile, usID == 0x216 ? 50 : 66); + tPosition += tSkipBytes(pFile, 50); + if ((usRecordInstance ^ MSOBI_WMF) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf01c: DBG_MSG("PICT"); *peImageType = imagetype_is_pict; - tPosition += tSkipBytes(pFile, usID == 0x542 ? 17 : 33); + tPosition += tSkipBytes(pFile, 50); + if ((usRecordInstance ^ MSOBI_PICT) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf01d: DBG_MSG("JPEG"); *peImageType = imagetype_is_jpeg; - tPosition += tSkipBytes(pFile, usID == 0x46a ? 17 : 33); + tPosition += tSkipBytes(pFile, 17); + if ((usRecordInstance ^ MSOBI_JPEG) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf01e: DBG_MSG("PNG"); *peImageType = imagetype_is_png; - tPosition += tSkipBytes(pFile, usID == 0x6e0 ? 17 : 33); + tPosition += tSkipBytes(pFile, 17); + if ((usRecordInstance ^ MSOBI_PNG) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf01f: DBG_MSG("DIB"); /* DIB is a BMP minus its 14 byte header */ *peImageType = imagetype_is_dib; - tPosition += tSkipBytes(pFile, usID == 0x7a8 ? 17 : 33); + tPosition += tSkipBytes(pFile, 17); + if ((usRecordInstance ^ MSOBI_DIB) == 1) { + tPosition += tSkipBytes(pFile, 16); + } return tPosition; case 0xf00c: default: - DBG_HEX(usElementTag); - DBG_DEC_C(tElementLen % 4 != 0, tElementLen); + DBG_HEX(usRecordType); + DBG_DEC_C(tRecordLength % 4 != 0, tRecordLength); DBG_FIXME(); return (size_t)-1; } [jmk] --rw-rw-r-- M 499692 jmk sys 26488 Jan 14 12:57 sys/src/cmd/aux/antiword/imgexam.c [jmk] --rw-rw-r-- M 499692 jmk sys 1703 Jan 14 12:57 sys/src/cmd/aux/antiword/imgtrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 1703 Jan 14 12:57 sys/src/cmd/aux/antiword/imgtrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 1482 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 1482 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 2159 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 2159 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 7855 Jan 14 12:57 sys/src/cmd/aux/antiword/listlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 7855 Jan 14 12:57 sys/src/cmd/aux/antiword/listlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 13140 Jan 14 12:57 sys/src/cmd/aux/antiword/main_ros.c [jmk] --rw-rw-r-- M 499692 jmk sys 8171 Jan 14 12:57 sys/src/cmd/aux/antiword/main_u.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/main_u.c:3,9 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/main_u.c:3,9 * * Released under GPL * - * Copyright (C) 1998-2003 A.J. van Os + * Copyright (C) 1998-2004 A.J. van Os * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/main_u.c:29,37 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/main_u.c:29,49 #include #include #endif /* __dos */ - #if defined(__STDC_ISO_10646__) + #if defined(__CYGWIN__) || defined(__CYGMING__) + # ifdef X_LOCALE + # include + # else + # include + # endif + #else #include - #endif /* __STDC_ISO_10646__ */ + #endif /* __CYGWIN__ || __CYGMING__ */ + #if defined(N_PLAT_NLM) + #if !defined(_VA_LIST) + #include "NW-only/nw_os.h" + #endif /* !_VA_LIST */ + #include "getopt.h" + #endif /* N_PLAT_NLM */ #include "version.h" #include "antiword.h" /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/main_u.c:45,60 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/main_u.c:57,78 fprintf(stderr, "\tName: %s\n", szTask); fprintf(stderr, "\tPurpose: "PURPOSESTRING"\n"); fprintf(stderr, "\tAuthor: "AUTHORSTRING"\n"); - fprintf(stderr, "\tVersion: "VERSIONSTRING"\n"); + fprintf(stderr, "\tVersion: "VERSIONSTRING); + #if defined(__dos) + fprintf(stderr, VERSIONSTRING2); + #endif /* __dos */ + fprintf(stderr, "\n"); fprintf(stderr, "\tStatus: "STATUSSTRING"\n"); fprintf(stderr, "\tUsage: %s [switches] wordfile1 [wordfile2 ...]\n", szTask); fprintf(stderr, - "\tSwitches: [-t|-p papersize|-x dtd][-m mapping][-w #][-i #]" - "[-Ls]\n"); + "\tSwitches: [-f|-t|-a papersize|-p papersize|-x dtd]" + "[-m mapping][-w #][-i #][-Ls]\n"); + fprintf(stderr, "\t\t-f formatted text output\n"); fprintf(stderr, "\t\t-t text output (default)\n"); + fprintf(stderr, "\t\t-a Adobe PDF output\n"); fprintf(stderr, "\t\t-p PostScript output\n"); - fprintf(stderr, "\t\t like: a4, letter or legal\n"); + fprintf(stderr, "\t\t paper size like: a4, letter or legal\n"); fprintf(stderr, "\t\t-x XML output\n"); fprintf(stderr, "\t\t like: db (DocBook)\n"); fprintf(stderr, "\t\t-m character mapping file\n"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/main_u.c:61,66 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/main_u.c:79,85 fprintf(stderr, "\t\t-w in characters of text output\n"); fprintf(stderr, "\t\t-i image level (PostScript only)\n"); fprintf(stderr, "\t\t-L use landscape mode (PostScript only)\n"); + fprintf(stderr, "\t\t-r Show removed text\n"); fprintf(stderr, "\t\t-s Show hidden (by Word) text\n"); } /* end of vUsage */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/main_u.c:225,250 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/main_u.c:244,293 return iFirst < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } + #if defined(N_PLAT_NLM) && !defined(_VA_LIST) + nwinit(); + #endif /* N_PLAT_NLM && !_VA_LIST */ + vGetOptions(&tOptions); + #if !defined(__dos) + if (is_locale_utf8()) { #if defined(__STDC_ISO_10646__) - /* - * If the user wants UTF-8 and the envirionment variables support - * UTF-8, than set the locale accordingly - */ - if (tOptions.eEncoding == encoding_utf8 && is_locale_utf8()) { + /* + * If the user wants UTF-8 and the envirionment variables + * support UTF-8, than set the locale accordingly + */ + if (tOptions.eEncoding == encoding_utf_8) { + if (setlocale(LC_CTYPE, "") == NULL) { + werr(1, "Can't set the UTF-8 locale! " + "Check LANG, LC_CTYPE, LC_ALL."); + } + DBG_MSG("The UTF-8 locale has been set"); + } else { + (void)setlocale(LC_CTYPE, "C"); + } + #endif /* __STDC_ISO_10646__ */ + } else { if (setlocale(LC_CTYPE, "") == NULL) { - werr(1, "Can't set the UTF-8 locale! " - "Check LANG, LC_CTYPE, LC_ALL."); + werr(0, "Can't set the locale! Will use defaults"); + (void)setlocale(LC_CTYPE, "C"); } - DBG_MSG("The UTF-8 locale has been set"); + DBG_MSG("The locale has been set"); } - #endif /* __STDC_ISO_10646__ */ + #endif /* !__dos */ bMultiple = argc - iFirst > 1; - bUseTXT = tOptions.eConversionType == conversion_text; + bUseTXT = tOptions.eConversionType == conversion_text || + tOptions.eConversionType == conversion_fmt_text; bUseXML = tOptions.eConversionType == conversion_xml; iGoodCount = 0; + + #if defined(__dos) + if (tOptions.eConversionType == conversion_pdf) { + /* PDF must be written as a binary stream */ + setmode(fileno(stdout), O_BINARY); + } + #endif /* __dos */ if (bUseXML) { fprintf(stdout, [jmk] --rw-rw-r-- M 499692 jmk sys 8171 Jan 14 12:57 sys/src/cmd/aux/antiword/main_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 21663 Jan 14 12:57 sys/src/cmd/aux/antiword/misc.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:1,6 /* * misc.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Miscellaneous functions /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:12,31 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:12,31 #include #include #if defined(__riscos) - #include "kernel.h" - #include "swis.h" + #include "DeskLib:SWI.h" #else #include #include #include #endif /* __riscos */ - #if defined(__dos) - #define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) + #if !defined(S_ISREG) #define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) - #endif /* __dos */ + #endif /* !S_ISREG */ #include "antiword.h" + #if defined(__vms) + #include + #endif - #if !defined(__riscos) /* * szGetHomeDirectory - get the name of the home directory /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:36,51 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:36,52 const char *szHome; #if defined(__vms) - #include szHome = decc$translate_vms(getenv("HOME")); #elif defined(__Plan9__) szHome = getenv("home"); - #else + #else szHome = getenv("HOME"); - #endif + #endif /* __vms */ if (szHome == NULL || szHome[0] == '\0') { - #if defined(__dos) + #if defined(N_PLAT_NLM) + szHome = "SYS:"; + #elif defined(__dos) szHome = "C:"; #else werr(0, "I can't find the name of your HOME directory"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:62,73 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:63,73 szGetAntiwordDirectory(void) { #if defined(__vms) - #include return decc$translate_vms(getenv("ANTIWORDHOME")); #else return getenv("ANTIWORDHOME"); #endif /* __vms */ - } /* end of szGetHomeDirectory */ + } /* end of szGetAntiwordDirectory */ #endif /* !__riscos */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:78,103 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:78,103 lGetFilesize(const char *szFilename) { #if defined(__riscos) - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; + int iType, iSize; - (void)memset(®s, 0, sizeof(regs)); - regs.r[0] = 17; - regs.r[1] = (int)szFilename; - e = _kernel_swi(OS_File, ®s, ®s); + e = SWI(2, 5, SWI_OS_File | XOS_Bit, + 17, szFilename, + &iType, NULL, NULL, NULL, &iSize); if (e != NULL) { werr(0, "Get Filesize error %d: %s", e->errnum, e->errmess); return -1; } - if (regs.r[0] != 1) { + if (iType != 1) { /* It's not a proper file or the file does not exist */ return -1; } - return (long)regs.r[4]; + return (long)iSize; #else struct stat tBuffer; + errno = 0; if (stat(szFilename, &tBuffer) != 0) { werr(0, "Get Filesize error %d", errno); return -1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:136,142 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:136,142 } /* end of vPrintBlock */ void - vPrintUnicode(const char *szFile, int iLine, const UCHAR *aucUni, size_t tLen) + vPrintUnicode(const char *szFile, int iLine, const UCHAR *aucUni, size_t tLen) { char *szASCII; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:249,255 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:249,255 } /* end of bReadBuffer */ /* - * Translate a Word colornumber into a true color for use in a drawfile + * Convert a Word colornumber into a true color for use in a drawfile * * Returns the true color */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:469,480 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:469,480 char * unincpy(char *s1, const UCHAR *s2, size_t n) { - char *dest; + char *pcDest; ULONG ulChar; size_t tLen; USHORT usUni; - for (dest = s1, tLen = 0; tLen < n; dest++, tLen++) { + for (pcDest = s1, tLen = 0; tLen < n; pcDest++, tLen++) { usUni = usGetWord(tLen * 2, s2); if (usUni == 0) { break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:484,493 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:484,493 if (ulChar == IGNORE_CHARACTER) { ulChar = (ULONG)'?'; } - *dest = (char)ulChar; + *pcDest = (char)ulChar; } for (; tLen < n; tLen++) { - *dest++ = '\0'; + *pcDest++ = '\0'; } return s1; } /* end of unincpy */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:614,627 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:614,624 fail(szResult == NULL); fail(tMaxResultLen < 2); - if (eEncoding == encoding_utf8) { + if (eEncoding == encoding_utf_8) { (void)tUcs2Utf8(UNICODE_BULLET, szResult, tMaxResultLen); - } else if (eEncoding == encoding_iso_8859_1 && - eConversionType == conversion_ps) { - szResult[0] = OUR_BULLET_PS; - szResult[1] = '\0'; } else { - szResult[0] = OUR_BULLET_TEXT; + szResult[0] = (char)ucGetBulletCharacter(eConversionType, + eEncoding); szResult[1] = '\0'; } } /* end of vGetBulletValue */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/misc.c:645,647 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/misc.c:642,894 } return TRUE; } /* end of bAllZero */ + + #if !defined(__riscos) + /* + * GetCodesetFromLocale - get the codeset from the current locale + * + * Original version: Copyright (C) 1999 Bruno Haible + * Syntax: + * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]] + * + * Returns TRUE when sucessful, otherwise FALSE + */ + static BOOL + bGetCodesetFromLocale(char *szCodeset, size_t tMaxCodesetLength, BOOL *pbEuro) + { + #if !defined(__dos) + const char *szLocale; + const char *pcTmp; + size_t tIndex; + char szModifier[6]; + #endif /* __dos */ + + if (pbEuro != NULL) { + *pbEuro = FALSE; /* Until proven otherwise */ + } + if (szCodeset == NULL || tMaxCodesetLength == 0) { + return FALSE; + } + + #if defined(__dos) + if (tMaxCodesetLength < 2 + sizeof(int) * 3 + 1) { + DBG_DEC(tMaxCodesetLength); + DBG_DEC(2 + sizeof(int) * 3 + 1); + return FALSE; + } + /* Get the active codepage from DOS */ + sprintf(szCodeset, "cp%d", iGetCodepage()); + DBG_MSG(szCodeset); + #else + /* Get the locale from the environment */ + szLocale = getenv("LC_ALL"); + if (szLocale == NULL || szLocale[0] == '\0') { + szLocale = getenv("LC_CTYPE"); + if (szLocale == NULL || szLocale[0] == '\0') { + szLocale = getenv("LANG"); + } + } + if (szLocale == NULL || szLocale[0] == '\0') { + /* No locale, so no codeset name and no modifier */ + return FALSE; + } + DBG_MSG(szLocale); + pcTmp = strchr(szLocale, '.'); + if (pcTmp == NULL) { + /* No codeset name */ + szCodeset[0] = '\0'; + } else { + /* Copy the codeset name */ + pcTmp++; + for (tIndex = 0; tIndex < tMaxCodesetLength; tIndex++) { + if (*pcTmp == '@' || *pcTmp == '+' || + *pcTmp == ',' || *pcTmp == '_' || + *pcTmp == '\0') { + szCodeset[tIndex] = '\0'; + break; + } + szCodeset[tIndex] = *pcTmp; + pcTmp++; + } + szCodeset[tMaxCodesetLength - 1] = '\0'; + } + if (pbEuro == NULL) { + /* No need to get the modifier */ + return TRUE; + } + pcTmp = strchr(szLocale, '@'); + if (pcTmp != NULL) { + /* Copy the modifier */ + pcTmp++; + for (tIndex = 0; tIndex < sizeof(szModifier); tIndex++) { + if (*pcTmp == '+' || *pcTmp == ',' || + *pcTmp == '_' || *pcTmp == '\0') { + szModifier[tIndex] = '\0'; + break; + } + szModifier[tIndex] = *pcTmp; + pcTmp++; + } + szModifier[sizeof(szModifier) - 1] = '\0'; + *pbEuro = STRCEQ(szModifier, "Euro"); + } + #endif /* __dos */ + return TRUE; + } /* end of bGetCodesetFromLocale */ + + /* + * GetNormalizedCodeset - get the normalized codeset from the current locale + * + * Returns TRUE when sucessful, otherwise FALSE + */ + BOOL + bGetNormalizedCodeset(char *szCodeset, size_t tMaxCodesetLength, BOOL *pbEuro) + { + BOOL bOnlyDigits; + const char *pcSrc; + char *pcDest; + char *szTmp, *szCodesetNorm; + + if (pbEuro != NULL) { + *pbEuro = FALSE; /* Until proven otherwise */ + } + if (szCodeset == NULL || tMaxCodesetLength < 4) { + return FALSE; + } + + /* Get the codeset name */ + szTmp = xmalloc(tMaxCodesetLength - 3); + if (!bGetCodesetFromLocale(szTmp, tMaxCodesetLength - 3, pbEuro)) { + szTmp = xfree(szTmp); + return FALSE; + } + /* Normalize the codeset name */ + szCodesetNorm = xmalloc(tMaxCodesetLength - 3); + bOnlyDigits = TRUE; + pcDest = szCodesetNorm; + for (pcSrc = szTmp; *pcSrc != '\0'; pcSrc++) { + if (isalnum(*pcSrc)) { + *pcDest = tolower(*pcSrc); + if (!isdigit(*pcDest)) { + bOnlyDigits = FALSE; + } + pcDest++; + } + } + *pcDest = '\0'; + DBG_MSG(szCodesetNorm); + /* Add "iso" when szCodesetNorm contains all digits */ + if (bOnlyDigits && szCodesetNorm[0] != '\0') { + fail(strlen(szCodesetNorm) + 3 >= tMaxCodesetLength); + sprintf(szCodeset, "iso%s", szCodesetNorm); + } else { + fail(strlen(szCodesetNorm) >= tMaxCodesetLength); + strncpy(szCodeset, szCodesetNorm, pcDest - szCodesetNorm + 1); + szCodeset[tMaxCodesetLength - 1] = '\0'; + } + DBG_MSG(szCodeset); + /* Clean up and leave */ + szCodesetNorm = xfree(szCodesetNorm); + szTmp = xfree(szTmp); + return TRUE; + } /* end of bGetNormalizedCodeset */ + + /* + * szGetDefaultMappingFile - get the default mapping file + * + * Returns the basename of the default mapping file + */ + const char * + szGetDefaultMappingFile(void) + { + static const struct { + const char *szCodeset; + const char *szMappingFile; + } atMappingFile[] = { + { "iso88591", MAPPING_FILE_8859_1 }, + { "iso88592", MAPPING_FILE_8859_2 }, + { "iso88593", "8859-3.txt" }, + { "iso88594", "8859-4.txt" }, + { "iso88595", "8859-5.txt" }, + { "iso88596", MAPPING_FILE_8859_5 }, + { "iso88597", "8859-7.txt" }, + { "iso88598", "8859-8.txt" }, + { "iso88599", "8859-9.txt" }, + { "iso885910", "8859-10.txt" }, + { "iso885913", "8859-13.txt" }, + { "iso885914", "8859-14.txt" }, + { "iso885915", MAPPING_FILE_8859_15 }, + { "iso885916", "8859-16.txt" }, + { "koi8r", MAPPING_FILE_KOI8_R }, + { "koi8u", MAPPING_FILE_KOI8_U }, + { "utf8", MAPPING_FILE_UTF_8 }, + { "cp437", MAPPING_FILE_CP437 }, + { "cp850", "cp850.txt" }, + { "cp852", MAPPING_FILE_CP852 }, + { "cp862", "cp862.txt" }, + { "cp864", "cp864.txt" }, + { "cp866", MAPPING_FILE_CP866 }, + { "cp1250", MAPPING_FILE_CP1250 }, + { "cp1251", MAPPING_FILE_CP1251 }, + { "cp1252", "cp1252.txt" }, + }; + size_t tIndex; + BOOL bEuro; + char szCodeset[20]; + + szCodeset[0] = '\0'; + bEuro = FALSE; + /* Get the normalized codeset name */ + if (!bGetNormalizedCodeset(szCodeset, sizeof(szCodeset), &bEuro)) { + return MAPPING_FILE_8859_1; + } + if (szCodeset[0] == '\0') { + if (bEuro) { + /* Default mapping file (with Euro sign) */ + return MAPPING_FILE_8859_15; + } else { + /* Default mapping file (without Euro sign) */ + return MAPPING_FILE_8859_1; + } + } + /* Find the name in the table */ + for (tIndex = 0; tIndex < elementsof(atMappingFile); tIndex++) { + if (STREQ(atMappingFile[tIndex].szCodeset, szCodeset)) { + return atMappingFile[tIndex].szMappingFile; + } + } + /* Default default mapping file */ + #if defined(__dos) + return MAPPING_FILE_CP437; + #else + return MAPPING_FILE_8859_1; + #endif /* __dos */ + } /* end of szGetDefaultMappingFile */ + #endif /* !__riscos */ + + /* + * tConvertDTTM - convert Windows Date and Time format + * + * returns Unix time_t or -1 + */ + time_t + tConvertDTTM(ULONG ulDTTM) + { + struct tm tTime; + time_t tResult; + + if (ulDTTM == 0) { + return (time_t)-1; + } + memset(&tTime, 0, sizeof(tTime)); + tTime.tm_min = (int)(ulDTTM & 0x0000003f); + tTime.tm_hour = (int)((ulDTTM & 0x000007c0) >> 6); + tTime.tm_mday = (int)((ulDTTM & 0x0000f800) >> 11); + tTime.tm_mon = (int)((ulDTTM & 0x000f0000) >> 16); + tTime.tm_year = (int)((ulDTTM & 0x1ff00000) >> 20); + tTime.tm_isdst = -1; + tTime.tm_mon--; /* From 01-12 to 00-11 */ + tResult = mktime(&tTime); + NO_DBG_MSG(ctime(&tResult)); + return tResult; + } /* end of tConvertDTTM */ [jmk] --rw-rw-r-- M 499692 jmk sys 21663 Jan 14 12:57 sys/src/cmd/aux/antiword/misc.c [jmk] --rw-rw-r-- M 499692 jmk sys 1007 Jan 14 12:57 sys/src/cmd/aux/antiword/mkfile /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/mkfile:6,17 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/mkfile:6,18 TARG=antiword OFILES= main_u.$O asc85enc.$O blocklist.$O chartrans.$O datalist.$O depot.$O\ - dib2eps.$O fail.$O finddata.$O findtext.$O fontlist.$O fonts.$O fonts_u.$O\ - imgexam.$O imgtrans.$O jpeg2eps.$O listlist.$O misc.$O notes.$O options.$O\ - out2window.$O output.$O pictlist.$O png2eps.$O postscript.$O prop0.$O prop2.$O\ - prop6.$O prop8.$O properties.$O propmod.$O rowlist.$O sectlist.$O stylelist.$O\ - stylesheet.$O summary.$O tabstop.$O text.$O unix.$O utf8.$O word2text.$O\ - worddos.$O wordlib.$O wordmac.$O wordole.$O wordwin.$O xmalloc.$O xml.$O + dib2eps.$O doclist.$O fail.$O finddata.$O findtext.$O fmt_text.$O fontlist.$O\ + fonts.$O fonts_u.$O hdrftrlist.$O imgexam.$O imgtrans.$O jpeg2eps.$O\ + listlist.$O misc.$O notes.$O options.$O out2window.$O output.$O pdf.$O\ + pictlist.$O png2eps.$O postscript.$O prop0.$O prop2.$O prop6.$O prop8.$O\ + properties.$O propmod.$O rowlist.$O sectlist.$O stylelist.$O stylesheet.$O\ + summary.$O tabstop.$O text.$O unix.$O utf8.$O word2text.$O worddos.$O\ + wordlib.$O wordmac.$O wordole.$O wordwin.$O xmalloc.$O xml.$O HFILES=antiword.h debug.h draw.h fail.h fontinfo.h version.h wordconst.h wordtypes.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/mkfile:21,26 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/mkfile:22,28 main_u.$O: version.h postscript.$O: version.h + pdf.$O: version.h fonts_u.$O: fontinfo.h # fontinfo.h: Unix-fontinfo.pl [jmk] --rw-rw-r-- M 499692 jmk sys 1007 Jan 14 12:57 sys/src/cmd/aux/antiword/mkfile [jmk] --rw-rw-r-- M 499692 jmk sys 24813 Jan 14 12:57 sys/src/cmd/aux/antiword/notes.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:1,6 /* * notes.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Functions to tell the difference between footnotes and endnotes /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:8,18 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:8,32 #include "antiword.h" - /* Variables needed to write the Footnote and Endnote Lists */ + /* + * Private structures to hide the way the information + * is stored from the rest of the program + */ + typedef struct footnote_local_tag { + footnote_block_type tInfo; + ULONG ulCharPosStart; + ULONG ulCharPosNext; + BOOL bUseful; + } footnote_local_type; + + /* Variables needed to write the Footnote and Endnote information */ static ULONG *aulFootnoteList = NULL; static size_t tFootnoteListLength = 0; static ULONG *aulEndnoteList = NULL; static size_t tEndnoteListLength = 0; + /* Variables needed to write the Footnote Text */ + static footnote_local_type *pFootnoteText = NULL; + static size_t tFootnoteTextLength = 0; /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:21,36 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:35,297 void vDestroyNotesInfoLists(void) { - DBG_MSG("vDestroyNotesInfoLists"); + footnote_local_type *pRecord; + size_t tFootnote; + TRACE_MSG("vDestroyNotesInfoLists"); + /* Free the lists and reset all control variables */ aulEndnoteList = xfree(aulEndnoteList); aulFootnoteList = xfree(aulFootnoteList); tEndnoteListLength = 0; tFootnoteListLength = 0; + for (tFootnote = 0; tFootnote < tFootnoteTextLength; tFootnote++) { + pRecord = pFootnoteText + tFootnote; + pRecord->tInfo.szText = xfree(pRecord->tInfo.szText); + } + pFootnoteText = xfree(pFootnoteText); + tFootnoteTextLength = 0; } /* end of vDestroyNotesInfoLists */ /* + * Build the list with footnote information for Word for DOS files + */ + static void + vGet0FootnotesInfoAndText(FILE *pFile, const UCHAR *aucHeader) + { + footnote_local_type *pCurr; + UCHAR *aucBuffer; + ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo; + ULONG ulCharPos, ulBeginNextBlock; + size_t tFootnotes, tFootnoteInfoLen; + size_t tIndex; + UCHAR aucTmp[2]; + + TRACE_MSG("vGet0FootnotesInfoAndText"); + + fail(pFile == NULL || aucHeader == NULL); + + ulBeginOfText = 128; + NO_DBG_HEX(ulBeginOfText); + ulBeginFootnoteInfo = 128 * (ULONG)usGetWord(0x14, aucHeader); + DBG_HEX(ulBeginFootnoteInfo); + ulBeginNextBlock = 128 * (ULONG)usGetWord(0x16, aucHeader); + DBG_HEX(ulBeginNextBlock); + + if (ulBeginFootnoteInfo == ulBeginNextBlock) { + DBG_MSG("No Footnotes in this document"); + return; + } + + /* Read the the number of footnotes + 1 */ + if (!bReadBytes(aucTmp, 2, ulBeginFootnoteInfo, pFile)) { + return; + } + tFootnotes = (size_t)usGetWord(0, aucTmp); + if (tFootnotes < 2) { + DBG_MSG("No Footnotes in this document (2)"); + } + DBG_DEC(tFootnotes); + tFootnoteInfoLen = 8 * tFootnotes; + + aucBuffer = xmalloc(tFootnoteInfoLen); + if (!bReadBytes(aucBuffer, + tFootnoteInfoLen, ulBeginFootnoteInfo + 4, pFile)) { + aucBuffer = xfree(aucBuffer); + return; + } + DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen); + + /* Get footnote information */ + fail(tFootnoteListLength != 0); + tFootnoteListLength = tFootnotes - 1; + fail(tFootnoteListLength == 0); + + fail(aulFootnoteList != NULL); + aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG)); + + for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 8, aucBuffer); + DBG_HEX(ulOffset); + ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); + DBG_HEX(ulFileOffset); + aulFootnoteList[tIndex] = ulFileOffset; + } + + /* Get footnote text */ + fail(tFootnoteTextLength != 0); + tFootnoteTextLength = tFootnotes - 1; + fail(tFootnoteTextLength == 0); + + fail(pFootnoteText != NULL); + pFootnoteText = xcalloc(tFootnoteTextLength, + sizeof(footnote_local_type)); + + for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) { + pCurr = pFootnoteText + tIndex; + pCurr->tInfo.szText = NULL; + ulOffset = ulGetLong(tIndex * 8 + 4, aucBuffer); + DBG_HEX(ulOffset); + ulCharPos = ulBeginOfText + ulOffset; + DBG_HEX(ulCharPos); + DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosStart = ulCharPos; + ulOffset = ulGetLong((tIndex + 1) * 8 + 4, aucBuffer); + DBG_HEX(ulOffset); + ulCharPos = ulBeginOfText + ulOffset; + DBG_HEX(ulCharPos); + DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosNext = ulCharPos; + pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext; + } + aucBuffer = xfree(aucBuffer); + } /* end of vGet0FootnotesInfoAndText */ + + /* + * Build the lists note information for Word for DOS files + */ + static void + vGet0NotesInfo(FILE *pFile, const UCHAR *aucHeader) + { + TRACE_MSG("vGet0NotesInfo"); + + vGet0FootnotesInfoAndText(pFile, aucHeader); + /* There are no endnotes in a Word for DOS file */ + } /* end of vGet0NotesInfo */ + + /* + * Build the list with footnote information for WinWord 1/2 files + */ + static void + vGet2FootnotesInfo(FILE *pFile, const UCHAR *aucHeader) + { + UCHAR *aucBuffer; + ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo; + size_t tFootnoteInfoLen; + size_t tIndex; + + TRACE_MSG("vGet2FootnotesInfo"); + + fail(pFile == NULL || aucHeader == NULL); + + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ + NO_DBG_HEX(ulBeginOfText); + ulBeginFootnoteInfo = ulGetLong(0x64, aucHeader); /* fcPlcffndRef */ + NO_DBG_HEX(ulBeginFootnoteInfo); + tFootnoteInfoLen = (size_t)usGetWord(0x68, aucHeader); /* cbPlcffndRef */ + NO_DBG_DEC(tFootnoteInfoLen); + + if (tFootnoteInfoLen < 10) { + DBG_MSG("No Footnotes in this document"); + return; + } + + aucBuffer = xmalloc(tFootnoteInfoLen); + if (!bReadBytes(aucBuffer, + tFootnoteInfoLen, ulBeginFootnoteInfo, pFile)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen); + + fail(tFootnoteListLength != 0); + tFootnoteListLength = (tFootnoteInfoLen - 4) / 6; + fail(tFootnoteListLength == 0); + + fail(aulFootnoteList != NULL); + aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG)); + + for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); + NO_DBG_HEX(ulFileOffset); + aulFootnoteList[tIndex] = ulFileOffset; + } + aucBuffer = xfree(aucBuffer); + } /* end of vGet2FootnotesInfo */ + + /* + * Build the list with footnote text information for WinWord 1/2 files + */ + static void + vGet2FootnotesText(FILE *pFile, const UCHAR *aucHeader) + { + footnote_local_type *pCurr; + UCHAR *aucBuffer; + ULONG ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText; + size_t tFootnoteTextLen; + size_t tIndex; + + TRACE_MSG("vGet2FootnotesText"); + + fail(pFile == NULL || aucHeader == NULL); + + ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */ + ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */ + NO_DBG_HEX(ulBeginOfFootnotes); + + ulBeginFootnoteText = ulGetLong(0x6a, aucHeader); /* fcPlcffndTxt */ + NO_DBG_HEX(ulBeginFootnoteText); + tFootnoteTextLen = + (size_t)usGetWord(0x6e, aucHeader); /* cbPlcffndTxt */ + NO_DBG_DEC(tFootnoteTextLen); + + if (tFootnoteTextLen < 12) { + DBG_MSG("No Footnote text in this document"); + return; + } + + aucBuffer = xmalloc(tFootnoteTextLen); + if (!bReadBytes(aucBuffer, + tFootnoteTextLen, ulBeginFootnoteText, pFile)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen); + + fail(tFootnoteTextLength != 0); + tFootnoteTextLength = tFootnoteTextLen / 4 - 2; + fail(tFootnoteTextLength == 0); + + fail(pFootnoteText != NULL); + pFootnoteText = xcalloc(tFootnoteTextLength, + sizeof(footnote_local_type)); + + for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) { + pCurr = pFootnoteText + tIndex; + pCurr->tInfo.szText = NULL; + ulOffset = ulGetLong(tIndex * 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosStart = ulCharPos; + ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosNext = ulCharPos; + pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext; + } + aucBuffer = xfree(aucBuffer); + } /* end of vGet2FootnotesText */ + + /* + * Build the lists note information for WinWord 1/2 files + */ + static void + vGet2NotesInfo(FILE *pFile, const UCHAR *aucHeader) + { + TRACE_MSG("vGet2NotesInfo"); + + vGet2FootnotesInfo(pFile, aucHeader); + vGet2FootnotesText(pFile, aucHeader); + /* There are no endnotes in a WinWord 1/2 file */ + } /* end of vGet2NotesInfo */ + + /* * Build the list with footnote information for Word 6/7 files */ static void /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:41,57 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:302,321 UCHAR *aucBuffer; ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo; size_t tFootnoteInfoLen; - int iIndex; + size_t tIndex; + TRACE_MSG("vGet6FootnotesInfo"); + fail(pFile == NULL || aucHeader == NULL); fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); fail(aulBBD == NULL); - ulBeginOfText = ulGetLong(0x18, aucHeader); + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ NO_DBG_HEX(ulBeginOfText); - ulBeginFootnoteInfo = ulGetLong(0x68, aucHeader); + ulBeginFootnoteInfo = ulGetLong(0x68, aucHeader); /* fcPlcffndRef */ NO_DBG_HEX(ulBeginFootnoteInfo); - tFootnoteInfoLen = (size_t)ulGetLong(0x6c, aucHeader); + tFootnoteInfoLen = + (size_t)ulGetLong(0x6c, aucHeader); /* lcbPlcffndRef */ NO_DBG_DEC(tFootnoteInfoLen); if (tFootnoteInfoLen < 10) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:75,91 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:339,427 fail(aulFootnoteList != NULL); aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG)); - for (iIndex = 0; iIndex < (int)tFootnoteListLength; iIndex++) { - ulOffset = ulGetLong(iIndex * 4, aucBuffer); + for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 4, aucBuffer); NO_DBG_HEX(ulOffset); ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); NO_DBG_HEX(ulFileOffset); - aulFootnoteList[iIndex] = ulFileOffset; + aulFootnoteList[tIndex] = ulFileOffset; } aucBuffer = xfree(aucBuffer); } /* end of vGet6FootnotesInfo */ /* + * Build the list with footnote text information for Word 6/7 files + */ + static void + vGet6FootnotesText(FILE *pFile, ULONG ulStartBlock, + const ULONG *aulBBD, size_t tBBDLen, + const UCHAR *aucHeader) + { + footnote_local_type *pCurr; + UCHAR *aucBuffer; + ULONG ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText; + size_t tFootnoteTextLen; + size_t tIndex; + + TRACE_MSG("vGet6FootnotesText"); + + fail(pFile == NULL || aucHeader == NULL); + fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); + fail(aulBBD == NULL); + + ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */ + ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */ + NO_DBG_HEX(ulBeginOfFootnotes); + + ulBeginFootnoteText = ulGetLong(0x70, aucHeader); /* fcPlcffndTxt */ + NO_DBG_HEX(ulBeginFootnoteText); + tFootnoteTextLen = + (size_t)ulGetLong(0x74, aucHeader); /* lcbPlcffndTxt */ + NO_DBG_DEC(tFootnoteTextLen); + + if (tFootnoteTextLen < 12) { + DBG_MSG("No Footnote text in this document"); + return; + } + + aucBuffer = xmalloc(tFootnoteTextLen); + if (!bReadBuffer(pFile, ulStartBlock, + aulBBD, tBBDLen, BIG_BLOCK_SIZE, + aucBuffer, ulBeginFootnoteText, tFootnoteTextLen)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen); + + fail(tFootnoteTextLength != 0); + tFootnoteTextLength = tFootnoteTextLen / 4 - 2; + fail(tFootnoteTextLength == 0); + + fail(pFootnoteText != NULL); + pFootnoteText = xcalloc(tFootnoteTextLength, + sizeof(footnote_local_type)); + + for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) { + pCurr = pFootnoteText + tIndex; + pCurr->tInfo.szText = NULL; + ulOffset = ulGetLong(tIndex * 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosStart = ulCharPos; + ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosNext = ulCharPos; + pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext; + } + aucBuffer = xfree(aucBuffer); + } /* end of vGet6FootnotesText */ + + /* * Build the list with endnote information for Word 6/7 files */ static void /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:96,112 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:432,451 UCHAR *aucBuffer; ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginEndnoteInfo; size_t tEndnoteInfoLen; - int iIndex; + size_t tIndex; + TRACE_MSG("vGet6EndnotesInfo"); + fail(pFile == NULL || aucHeader == NULL); fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); fail(aulBBD == NULL); - ulBeginOfText = ulGetLong(0x18, aucHeader); + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ NO_DBG_HEX(ulBeginOfText); - ulBeginEndnoteInfo = ulGetLong(0x1d2, aucHeader); + ulBeginEndnoteInfo = ulGetLong(0x1d2, aucHeader); /* fcPlcfendRef */ NO_DBG_HEX(ulBeginEndnoteInfo); - tEndnoteInfoLen = (size_t)ulGetLong(0x1d6, aucHeader); + tEndnoteInfoLen = + (size_t)ulGetLong(0x1d6, aucHeader); /* lcbPlcfendRef */ NO_DBG_DEC(tEndnoteInfoLen); if (tEndnoteInfoLen < 10) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:130,141 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:469,480 fail(aulEndnoteList != NULL); aulEndnoteList = xcalloc(tEndnoteListLength, sizeof(ULONG)); - for (iIndex = 0; iIndex < (int)tEndnoteListLength; iIndex++) { - ulOffset = ulGetLong(iIndex * 4, aucBuffer); + for (tIndex = 0; tIndex < tEndnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 4, aucBuffer); NO_DBG_HEX(ulOffset); ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); NO_DBG_HEX(ulFileOffset); - aulEndnoteList[iIndex] = ulFileOffset; + aulEndnoteList[tIndex] = ulFileOffset; } aucBuffer = xfree(aucBuffer); } /* end of vGet6EndnotesInfo */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:148,155 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:487,498 const ULONG *aulBBD, size_t tBBDLen, const UCHAR *aucHeader) { + TRACE_MSG("vGet6NotesInfo"); + vGet6FootnotesInfo(pFile, ulStartBlock, aulBBD, tBBDLen, aucHeader); + vGet6FootnotesText(pFile, ulStartBlock, + aulBBD, tBBDLen, aucHeader); vGet6EndnotesInfo(pFile, ulStartBlock, aulBBD, tBBDLen, aucHeader); } /* end of vGet6NotesInfo */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:166,181 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:509,525 const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo; - ULONG ulTableSize, ulTableStartBlock; size_t tFootnoteInfoLen, tBlockDepotLen, tBlockSize; - int iIndex; - USHORT usDocStatus; + size_t tIndex; - ulBeginOfText = ulGetLong(0x18, aucHeader); + TRACE_MSG("vGet8FootnotesInfo"); + + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ NO_DBG_HEX(ulBeginOfText); - ulBeginFootnoteInfo = ulGetLong(0xaa, aucHeader); + ulBeginFootnoteInfo = ulGetLong(0xaa, aucHeader); /* fcPlcffndRef */ NO_DBG_HEX(ulBeginFootnoteInfo); - tFootnoteInfoLen = (size_t)ulGetLong(0xae, aucHeader); + tFootnoteInfoLen = + (size_t)ulGetLong(0xae, aucHeader); /* lcbPlcffndRef */ NO_DBG_DEC(tFootnoteInfoLen); if (tFootnoteInfoLen < 10) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:183,204 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:527,540 return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - NO_DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_MSG("No notes information"); + NO_DBG_DEC(pPPS->tTable.ulSB); + NO_DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { + DBG_MSG("No footnotes information"); return; } - NO_DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:210,216 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:546,552 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tFootnoteInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginFootnoteInfo, tFootnoteInfoLen)) { aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:225,241 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:561,665 fail(aulFootnoteList != NULL); aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG)); - for (iIndex = 0; iIndex < (int)tFootnoteListLength; iIndex++) { - ulOffset = ulGetLong(iIndex * 4, aucBuffer); + for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 4, aucBuffer); NO_DBG_HEX(ulOffset); ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); NO_DBG_HEX(ulFileOffset); - aulFootnoteList[iIndex] = ulFileOffset; + aulFootnoteList[tIndex] = ulFileOffset; } aucBuffer = xfree(aucBuffer); } /* end of vGet8FootnotesInfo */ /* + * Build the list with footnote text information for Word 8/9/10 files + */ + static void + vGet8FootnotesText(FILE *pFile, const pps_info_type *pPPS, + const ULONG *aulBBD, size_t tBBDLen, + const ULONG *aulSBD, size_t tSBDLen, + const UCHAR *aucHeader) + { + footnote_local_type *pCurr; + const ULONG *aulBlockDepot; + UCHAR *aucBuffer; + ULONG ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText; + size_t tFootnoteTextLen, tBlockDepotLen, tBlockSize; + size_t tIndex; + + TRACE_MSG("vGet8FootnotesText"); + + ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */ + ulBeginOfFootnotes += ulGetLong(0x4c, aucHeader); /* ccpText */ + NO_DBG_HEX(ulBeginOfFootnotes); + + ulBeginFootnoteText = ulGetLong(0xb2, aucHeader); /* fcPlcffndTxt */ + NO_DBG_HEX(ulBeginFootnoteText); + tFootnoteTextLen = + (size_t)ulGetLong(0xb6, aucHeader); /* lcbPlcffndTxt */ + NO_DBG_DEC(tFootnoteTextLen); + + if (tFootnoteTextLen < 12) { + DBG_MSG("No Footnote text in this document"); + return; + } + + NO_DBG_DEC(pPPS->tTable.ulSB); + NO_DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { + DBG_MSG("No footnote text information"); + return; + } + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { + /* Use the Small Block Depot */ + aulBlockDepot = aulSBD; + tBlockDepotLen = tSBDLen; + tBlockSize = SMALL_BLOCK_SIZE; + } else { + /* Use the Big Block Depot */ + aulBlockDepot = aulBBD; + tBlockDepotLen = tBBDLen; + tBlockSize = BIG_BLOCK_SIZE; + } + aucBuffer = xmalloc(tFootnoteTextLen); + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, + aulBlockDepot, tBlockDepotLen, tBlockSize, + aucBuffer, ulBeginFootnoteText, tFootnoteTextLen)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen); + + fail(tFootnoteTextLength != 0); + tFootnoteTextLength = tFootnoteTextLen / 4 - 2; + fail(tFootnoteTextLength == 0); + + fail(pFootnoteText != NULL); + pFootnoteText = xcalloc(tFootnoteTextLength, + sizeof(footnote_local_type)); + + for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) { + pCurr = pFootnoteText + tIndex; + pCurr->tInfo.szText = NULL; + ulOffset = ulGetLong(tIndex * 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosStart = ulCharPos; + ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer); + NO_DBG_HEX(ulOffset); + ulCharPos = ulBeginOfFootnotes + ulOffset; + NO_DBG_HEX(ulCharPos); + NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos)); + pCurr->ulCharPosNext = ulCharPos; + pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext; + } + aucBuffer = xfree(aucBuffer); + } /* end of vGet8FootnotesText */ + + /* * Build the list with endnote information for Word 8/9/10 files */ static void /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:247,285 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:671,701 const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulFileOffset, ulBeginOfText, ulOffset, ulBeginEndnoteInfo; - ULONG ulTableSize, ulTableStartBlock; size_t tEndnoteInfoLen, tBlockDepotLen, tBlockSize; - int iIndex; - USHORT usDocStatus; + size_t tIndex; - ulBeginOfText = ulGetLong(0x18, aucHeader); + TRACE_MSG("vGet8EndnotesInfo"); + + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ NO_DBG_HEX(ulBeginOfText); - ulBeginEndnoteInfo = ulGetLong(0x20a, aucHeader); + ulBeginEndnoteInfo = ulGetLong(0x20a, aucHeader); /* fcPlcfendRef */ NO_DBG_HEX(ulBeginEndnoteInfo); - tEndnoteInfoLen = (size_t)ulGetLong(0x20e, aucHeader); + tEndnoteInfoLen = (size_t)ulGetLong(0x20e, aucHeader); /* lcbPlcfendRef */ NO_DBG_DEC(tEndnoteInfoLen); if (tEndnoteInfoLen < 10) { - DBG_MSG("No Endnotes in this document"); + DBG_MSG("No endnotes in this document"); return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - NO_DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_MSG("No notes information"); + NO_DBG_DEC(pPPS->tTable.ulSB); + NO_DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { + DBG_MSG("No endnotes information"); return; } - NO_DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:291,297 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:707,713 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tEndnoteInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginEndnoteInfo, tEndnoteInfoLen)) { aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:306,317 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:722,733 fail(aulEndnoteList != NULL); aulEndnoteList = xcalloc(tEndnoteListLength, sizeof(ULONG)); - for (iIndex = 0; iIndex < (int)tEndnoteListLength; iIndex++) { - ulOffset = ulGetLong(iIndex * 4, aucBuffer); + for (tIndex = 0; tIndex < tEndnoteListLength; tIndex++) { + ulOffset = ulGetLong(tIndex * 4, aucBuffer); NO_DBG_HEX(ulOffset); ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset); NO_DBG_HEX(ulFileOffset); - aulEndnoteList[iIndex] = ulFileOffset; + aulEndnoteList[tIndex] = ulFileOffset; } aucBuffer = xfree(aucBuffer); } /* end of vGet8EndnotesInfo */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:325,332 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:741,752 const ULONG *aulSBD, size_t tSBDLen, const UCHAR *aucHeader) { + TRACE_MSG("vGet8NotesInfo"); + vGet8FootnotesInfo(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); + vGet8FootnotesText(pFile, pPPS, + aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); vGet8EndnotesInfo(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); } /* end of vGet8NotesInfo */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:340,350 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:760,784 const ULONG *aulSBD, size_t tSBDLen, const UCHAR *aucHeader, int iWordVersion) { - fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); - fail(iWordVersion < 6 || iWordVersion > 8); - fail(aulBBD == NULL || aulSBD == NULL); + TRACE_MSG("vGetNotesInfo"); + fail(pFile == NULL); + fail(pPPS == NULL && iWordVersion >= 6); + fail(aulBBD == NULL && tBBDLen != 0); + fail(aulSBD == NULL && tSBDLen != 0); + fail(aucHeader == NULL); + switch (iWordVersion) { + case 0: + vGet0NotesInfo(pFile, aucHeader); + break; + case 1: + case 2: + vGet2NotesInfo(pFile, aucHeader); + break; + case 4: + case 5: + break; case 6: case 7: vGet6NotesInfo(pFile, pPPS->tWordDocument.ulSB, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:361,366 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:795,843 } /* end of vGetNotesInfo */ /* + * vPrepareFootnoteText - prepare the footnote text + */ + void + vPrepareFootnoteText(FILE *pFile) + { + footnote_local_type *pCurr; + size_t tFootnote; + + fail(pFile == NULL); + fail(pFootnoteText == NULL && tFootnoteTextLength != 0); + + if (pFootnoteText == NULL || tFootnoteTextLength == 0) { + /* No information */ + return; + } + + /* Fill text and useful-ness */ + for (tFootnote = 0; tFootnote < tFootnoteTextLength; tFootnote++) { + pCurr = pFootnoteText + tFootnote; + pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext; + if (pCurr->bUseful) { + pCurr->tInfo.szText = szFootnoteDecryptor(pFile, + pCurr->ulCharPosStart, + pCurr->ulCharPosNext); + } else { + pCurr->tInfo.szText = NULL; + } + } + } /* end of vPrepareFootnoteText */ + + /* + * szGetFootnootText - get the text of the spefified footnote + */ + const char * + szGetFootnootText(UINT uiFootnoteIndex) + { + if ((size_t)uiFootnoteIndex >= tFootnoteTextLength) { + return NULL; + } + return pFootnoteText[uiFootnoteIndex].tInfo.szText; + } /* end of szGetFootnootText */ + + /* * Get the notetype of the note at the given fileoffset */ notetype_enum /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/notes.c:367,372 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/notes.c:844,851 eGetNotetype(ULONG ulFileOffset) { size_t tIndex; + + TRACE_MSG("eGetNotetype"); fail(aulFootnoteList == NULL && tFootnoteListLength != 0); fail(aulEndnoteList == NULL && tEndnoteListLength != 0); [jmk] --rw-rw-r-- M 499692 jmk sys 24813 Jan 14 12:57 sys/src/cmd/aux/antiword/notes.c [jmk] --rw-rw-r-- M 499692 jmk sys 24707 Jan 14 12:57 sys/src/cmd/aux/antiword/options.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:1,6 /* * options.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Read and write the options /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:10,19 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:10,20 #include #include #if defined(__riscos) - #include "wimpt.h" + #include "DeskLib:Error.h" + #include "DeskLib:Wimp.h" #else #include - #if defined(__dos) + #if defined(__dos) || defined(N_PLAT_NLM) extern int getopt(int, char **, const char *); #else #include /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:28,33 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:29,36 #define SHOW_IMAGES "set show_images=%d" #define HIDE_HIDDEN_TEXT "set hide_hidden_text=%d" #define SCALE_FACTOR_START "set scale_factor_start=%d" + #else + #define LEAFNAME_SIZE (32+1) #endif /* __riscos */ /* Current values for options */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:69,76 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:72,80 conversion_text, #endif /* __riscos */ TRUE, + TRUE, FALSE, - encoding_iso_8859_1, + encoding_latin_1, INT_MAX, INT_MAX, level_default, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:81,87 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:85,274 }; + #if !defined(__riscos) /* + * bCorrectPapersize - see if the papersize is correct + * + * TRUE if the papersize is correct, otherwise FALSE + */ + static BOOL + bCorrectPapersize(const char *szName, conversion_type eConversionType) + { + const papersize_type *pPaperSize; + + for (pPaperSize = atPaperSizes; + pPaperSize->szName[0] != '\0'; + pPaperSize++) { + if (!STRCEQ(pPaperSize->szName, szName)) { + continue; + } + DBG_DEC(pPaperSize->usWidth); + DBG_DEC(pPaperSize->usHeight); + tOptionsCurr.eConversionType = eConversionType; + tOptionsCurr.iPageHeight = (int)pPaperSize->usHeight; + tOptionsCurr.iPageWidth = (int)pPaperSize->usWidth; + return TRUE; + } + return FALSE; + } /* end of bCorrectPapersize */ + + /* + * szCreateSuffix - create a suffix for the file + * + * Returns the suffix + */ + static const char * + szCreateSuffix(const char *szLeafname) + { + const char *pcDot; + + pcDot = strrchr(szLeafname, '.'); + if (pcDot != NULL && STRCEQ(pcDot, ".txt")) { + /* There is already a .txt suffix, no need for another one */ + return ""; + } + return ".txt"; + } /* end of szCreateSuffix */ + + /* + * eMappingFile2Encoding - convert the mapping file to an encoding + */ + static encoding_type + eMappingFile2Encoding(const char *szLeafname) + { + char szMappingFile[LEAFNAME_SIZE+4]; + + fail(szLeafname == NULL); + + if (strlen(szLeafname) + 4 >= sizeof(szMappingFile)) { + DBG_MSG(szLeafname); + return encoding_latin_1; + } + + sprintf(szMappingFile, "%s%s", szLeafname, szCreateSuffix(szLeafname)); + + DBG_MSG(szMappingFile); + + if (STRCEQ(szMappingFile, MAPPING_FILE_UTF_8)) { + return encoding_utf_8; + } + if (STRCEQ(szMappingFile, MAPPING_FILE_CP852) || + STRCEQ(szMappingFile, MAPPING_FILE_CP1250) || + STRCEQ(szMappingFile, MAPPING_FILE_8859_2)) { + return encoding_latin_2; + } + if (STRCEQ(szMappingFile, MAPPING_FILE_KOI8_R) || + STRCEQ(szMappingFile, MAPPING_FILE_KOI8_U) || + STRCEQ(szMappingFile, MAPPING_FILE_CP866) || + STRCEQ(szMappingFile, MAPPING_FILE_CP1251) || + STRCEQ(szMappingFile, MAPPING_FILE_8859_5)) { + return encoding_cyrillic; + } + return encoding_latin_1; + } /* end of eMappingFile2Encoding */ + #endif /* !__riscos */ + + /* + * pOpenCharacterMappingFile - open the mapping file + * + * Returns the file pointer or NULL + */ + static FILE * + pOpenCharacterMappingFile(const char *szLeafname) + { + #if !defined(__riscos) + FILE *pFile; + const char *szHome, *szAntiword, *szSuffix; + size_t tFilenameLen; + char szMappingFile[PATH_MAX+1]; + #endif /* !__riscos */ + + if (szLeafname == NULL || szLeafname[0] == '\0') { + return NULL; + } + + DBG_MSG(szLeafname); + + #if defined(__riscos) + return fopen(szLeafname, "r"); + #else + /* Set the suffix */ + szSuffix = szCreateSuffix(szLeafname); + + /* Set length */ + tFilenameLen = strlen(szLeafname) + strlen(szSuffix); + + /* Try the environment version of the mapping file */ + szAntiword = szGetAntiwordDirectory(); + if (szAntiword != NULL && szAntiword[0] != '\0') { + if (strlen(szAntiword) + tFilenameLen < + sizeof(szMappingFile) - + sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + "%s" FILE_SEPARATOR "%s%s", + szAntiword, szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Environment mappingfilename ignored"); + } + } + + /* Try the local version of the mapping file */ + szHome = szGetHomeDirectory(); + if (strlen(szHome) + tFilenameLen < + sizeof(szMappingFile) - + sizeof(ANTIWORD_DIR) - + 2 * sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + "%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s%s", + szHome, szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Local mappingfilename too long, ignored"); + } + + /* Try the global version of the mapping file */ + if (tFilenameLen < + sizeof(szMappingFile) - + sizeof(GLOBAL_ANTIWORD_DIR) - + sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s%s", + szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Global mappingfilename too long, ignored"); + } + werr(0, "I can't open your mapping file (%s%s)\n" + "It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '" + GLOBAL_ANTIWORD_DIR "'.", szLeafname, szSuffix, szHome); + return NULL; + #endif /* __riscos */ + } /* end of pOpenCharacterMappingFile */ + + /* + * vCloseCharacterMappingFile - close the mapping file + */ + static void + vCloseCharacterMappingFile(FILE *pFile) + { + (void)fclose(pFile); + } /* end of pCloseCharacterMappingFile */ + + + /* * iReadOptions - read options * * returns: -1: error /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:99,113 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:286,298 #else extern char *optarg; extern int optind; - const papersize_type *pPaperSize; - const char *szHome, *szAntiword; char *pcChar, *szTmp; int iChar; - BOOL bFound; - char szLeafname[32+1]; - char szMappingFile[PATH_MAX+1]; + char szLeafname[LEAFNAME_SIZE]; #endif /* __riscos */ + FILE *pCharacterMappingFile; int iTmp; + BOOL bSuccess; DBG_MSG("iReadOptions"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:175,184 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:360,373 werr(0, "Alphabet '%d' is not supported", iAlphabet); return -1; } - if (bReadCharacterMappingTable(szAlphabet)) { - return 1; + pCharacterMappingFile = pOpenCharacterMappingFile(szAlphabet); + if (pCharacterMappingFile != NULL) { + bSuccess = bReadCharacterMappingTable(pCharacterMappingFile); + vCloseCharacterMappingFile(pCharacterMappingFile); + } else { + bSuccess = FALSE; } - return -1; + return bSuccess ? 1 : -1; #else /* Environment */ szTmp = getenv("COLUMNS"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:196,214 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:385,407 DBG_DEC(tOptionsCurr.iParagraphBreak); } } - if (is_locale_utf8()) { - tOptionsCurr.eEncoding = encoding_utf8; - strcpy(szLeafname, MAPPING_FILE_DEFAULT_8); - } else { - tOptionsCurr.eEncoding = encoding_iso_8859_1; - strcpy(szLeafname, MAPPING_FILE_DEFAULT_1); - } + strncpy(szLeafname, szGetDefaultMappingFile(), sizeof(szLeafname) - 1); + szLeafname[sizeof(szLeafname) - 1] = '\0'; /* Command line */ - while ((iChar = getopt(argc, argv, "Lhi:m:p:stw:x:")) != -1) { + while ((iChar = getopt(argc, argv, "La:fhi:m:p:rstw:x:")) != -1) { switch (iChar) { case 'L': tOptionsCurr.bUseLandscape = TRUE; break; + case 'a': + if (!bCorrectPapersize(optarg, conversion_pdf)) { + werr(0, "-a without a valid papersize"); + return -1; + } + break; + case 'f': + tOptionsCurr.eConversionType = conversion_fmt_text; + break; case 'h': return 0; case 'i': /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:243,280 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:436,451 strncpy(szLeafname, optarg, sizeof(szLeafname) - 1); szLeafname[sizeof(szLeafname) - 1] = '\0'; DBG_MSG(szLeafname); - if (STRCEQ(szLeafname, MAPPING_FILE_DEFAULT_8)) { - tOptionsCurr.eEncoding = encoding_utf8; - } else if (STRCEQ(szLeafname, MAPPING_FILE_DEFAULT_2)) { - tOptionsCurr.eEncoding = encoding_iso_8859_2; - } else { - tOptionsCurr.eEncoding = encoding_iso_8859_1; - } - DBG_DEC(tOptionsCurr.eEncoding); break; case 'p': - bFound = FALSE; - for (pPaperSize = atPaperSizes; - pPaperSize->szName[0] != '\0'; - pPaperSize++) { - if (!STREQ(pPaperSize->szName, optarg)) { - continue; - } - DBG_DEC(pPaperSize->usWidth); - DBG_DEC(pPaperSize->usHeight); - tOptionsCurr.eConversionType = conversion_ps; - tOptionsCurr.iPageHeight = - (int)pPaperSize->usHeight; - tOptionsCurr.iPageWidth = - (int)pPaperSize->usWidth; - bFound = TRUE; - break; - } - if (!bFound) { + if (!bCorrectPapersize(optarg, conversion_ps)) { werr(0, "-p without a valid papersize"); return -1; } break; + case 'r': + tOptionsCurr.bRemoveRemovedText = FALSE; + break; case 's': tOptionsCurr.bHideHiddenText = FALSE; break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:297,303 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:468,474 if (STREQ(optarg, "db")) { tOptionsCurr.iParagraphBreak = 0; tOptionsCurr.eConversionType = conversion_xml; - tOptionsCurr.eEncoding = encoding_utf8; + strcpy(szLeafname, MAPPING_FILE_UTF_8); } else { werr(0, "-x %s is not supported", optarg); return -1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:308,322 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:479,511 } } + tOptionsCurr.eEncoding = eMappingFile2Encoding(szLeafname); + DBG_DEC(tOptionsCurr.eEncoding); + if (tOptionsCurr.eConversionType == conversion_ps && - tOptionsCurr.eEncoding == encoding_utf8) { + tOptionsCurr.eEncoding == encoding_utf_8) { werr(0, "The combination PostScript and UTF-8 is not supported"); return -1; } - if (tOptionsCurr.eConversionType == conversion_ps) { - /* PostScript mode */ + if (tOptionsCurr.eConversionType == conversion_pdf && + tOptionsCurr.eEncoding == encoding_utf_8) { + werr(0, + "The combination PDF and UTF-8 is not supported"); + return -1; + } + + if (tOptionsCurr.eConversionType == conversion_pdf && + tOptionsCurr.eEncoding == encoding_cyrillic) { + werr(0, + "The combination PDF and Cyrillic is not supported"); + return -1; + } + + if (tOptionsCurr.eConversionType == conversion_ps || + tOptionsCurr.eConversionType == conversion_pdf) { + /* PostScript or PDF mode */ if (tOptionsCurr.bUseLandscape) { /* Swap the page height and width */ iTmp = tOptionsCurr.iPageHeight; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:331,388 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:520,533 DBG_DEC(tOptionsCurr.iParagraphBreak); } - /* Try the environment version of the mapping file */ - szAntiword = szGetAntiwordDirectory(); - if (szAntiword != NULL && szAntiword[0] != '\0') { - if (strlen(szAntiword) + strlen(szLeafname) < - sizeof(szMappingFile) - - sizeof(FILE_SEPARATOR)) { - sprintf(szMappingFile, - "%s" FILE_SEPARATOR "%s", - szAntiword, szLeafname); - DBG_MSG(szMappingFile); - if (bReadCharacterMappingTable(szMappingFile)) { - return optind; - } - } else { - werr(0, "Environment mappingfilename ignored"); - } - } - /* Try the local version of the mapping file */ - szHome = szGetHomeDirectory(); - if (strlen(szHome) + strlen(szLeafname) < - sizeof(szMappingFile) - - sizeof(ANTIWORD_DIR) - - 2 * sizeof(FILE_SEPARATOR)) { - sprintf(szMappingFile, - "%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s", - szHome, szLeafname); - DBG_MSG(szMappingFile); - if (bReadCharacterMappingTable(szMappingFile)) { - return optind; - } + pCharacterMappingFile = pOpenCharacterMappingFile(szLeafname); + if (pCharacterMappingFile != NULL) { + bSuccess = bReadCharacterMappingTable(pCharacterMappingFile); + vCloseCharacterMappingFile(pCharacterMappingFile); } else { - werr(0, "Local mappingfilename too long, ignored"); + bSuccess = FALSE; } - /* Try the global version of the mapping file */ - if (strlen(szLeafname) < - sizeof(szMappingFile) - - sizeof(GLOBAL_ANTIWORD_DIR) - - sizeof(FILE_SEPARATOR)) { - sprintf(szMappingFile, - GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s", - szLeafname); - DBG_MSG(szMappingFile); - if (bReadCharacterMappingTable(szMappingFile)) { - return optind; - } - } else { - werr(0, "Global mappingfilename too long, ignored"); - } - werr(0, "I can't open your mapping file (%s)\n" - "It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '" - GLOBAL_ANTIWORD_DIR "'.", szLeafname, szHome); - return -1; + return bSuccess ? optind : -1; #endif /* __riscos */ } /* end of iReadOptions */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:407,413 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:552,558 FILE *pFile; char *szOptionsFile; - DBG_MSG("vWriteOptions"); + TRACE_MSG("vWriteOptions"); szOptionsFile = getenv("AntiWord$ChoicesSave"); if (szOptionsFile == NULL) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:443,451 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:588,596 * vChoicesOpenAction - action to be taken when the Choices window opens */ void - vChoicesOpenAction(wimp_w tWindow) + vChoicesOpenAction(window_handle tWindow) { - DBG_MSG("vChoicesOpenAction"); + TRACE_MSG("vChoicesOpenAction"); tOptionsTemp = tOptionsCurr; if (tOptionsTemp.iParagraphBreak == 0) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:483,488 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:628,634 } vUpdateWriteableNumber(tWindow, CHOICES_SCALE_WRITEABLE, tOptionsTemp.iScaleFactor); + TRACE_MSG("end of vChoicesOpenAction"); } /* end of vChoicesOpenAction */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:489,497 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:635,643 * vDefaultButtonAction - action when the default button is clicked */ static void - vDefaultButtonAction(wimp_w tWindow) + vDefaultButtonAction(window_handle tWindow) { - DBG_MSG("vDefaultButtonAction"); + TRACE_MSG("vDefaultButtonAction"); tOptionsTemp = tOptionsDefault; vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:520,526 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:666,672 static void vApplyButtonAction(void) { - DBG_MSG("vApplyButtonAction"); + TRACE_MSG("vApplyButtonAction"); tOptionsCurr = tOptionsTemp; } /* end of vApplyButtonAction */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:531,537 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:677,683 static void vSaveButtonAction(void) { - DBG_MSG("vSaveButtonAction"); + TRACE_MSG("vSaveButtonAction"); vApplyButtonAction(); vWriteOptions(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:541,547 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:687,693 * vSetParagraphBreak - set the paragraph break to the given number */ static void - vSetParagraphBreak(wimp_w tWindow, int iNumber) + vSetParagraphBreak(window_handle tWindow, int iNumber) { tOptionsTemp.iParagraphBreak = iNumber; if (tOptionsTemp.iParagraphBreak == 0) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:556,562 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:702,708 * vChangeParagraphBreak - change the paragraph break with the given number */ static void - vChangeParagraphBreak(wimp_w tWindow, int iNumber) + vChangeParagraphBreak(window_handle tWindow, int iNumber) { int iTmp; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:575,581 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:721,727 * vChangeAutofiletype - invert the permission to autofiletype */ static void - vChangeAutofiletype(wimp_w tWindow) + vChangeAutofiletype(window_handle tWindow) { tOptionsTemp.bAutofiletypeAllowed = !tOptionsTemp.bAutofiletypeAllowed; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:588,594 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:734,740 * vChangeHiddenText - invert the hide/show hidden text */ static void - vChangeHiddenText(wimp_w tWindow) + vChangeHiddenText(window_handle tWindow) { tOptionsTemp.bHideHiddenText = !tOptionsTemp.bHideHiddenText; vUpdateRadioButton(tWindow, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:613,619 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:759,765 * vSetScaleFactor - set the scale factor to the given number */ static void - vSetScaleFactor(wimp_w tWindow, int iNumber) + vSetScaleFactor(window_handle tWindow, int iNumber) { tOptionsTemp.iScaleFactor = iNumber; vUpdateWriteableNumber(tWindow, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:625,631 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:771,777 * vChangeScaleFactor - change the scale factor with the given number */ static void - vChangeScaleFactor(wimp_w tWindow, int iNumber) + vChangeScaleFactor(window_handle tWindow, int iNumber) { int iTmp; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:643,666 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:789,818 /* * bChoicesMouseClick - handle a mouse click in the Choices window */ - void - vChoicesMouseClick(wimp_mousestr *m) + BOOL + bChoicesMouseClick(event_pollblock *pEvent, void *pvReference) { - wimp_i tAction; - BOOL bCloseWindow, bLeft, bRight; + icon_handle tAction; + mouse_block *pMouse; + BOOL bCloseWindow; - bLeft = (m->bbits & wimp_BLEFT) == wimp_BLEFT; - bRight = (m->bbits & wimp_BRIGHT) == wimp_BRIGHT; - if (!bLeft && !bRight) { - DBG_HEX(m->bbits); - return; + TRACE_MSG("bChoicesMouseClick"); + + fail(pEvent == NULL); + fail(pEvent->type != event_CLICK); + + pMouse = &pEvent->data.mouse; + if (!pMouse->button.data.select && !pMouse->button.data.adjust) { + /* Not handled here */ + DBG_HEX(pMouse->button.value); + return FALSE; } /* Which action should be taken */ - tAction = m->i; - if (bRight) { - /* The right button reverses the direction */ - switch (m->i) { + tAction = pMouse->icon; + if (pMouse->button.data.adjust) { + /* The adjust button reverses the direction */ + switch (pMouse->icon) { case CHOICES_BREAK_UP_BUTTON: tAction = CHOICES_BREAK_DOWN_BUTTON; break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:682,688 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:834,840 bCloseWindow = FALSE; switch (tAction) { case CHOICES_DEFAULT_BUTTON: - vDefaultButtonAction(m->w); + vDefaultButtonAction(pMouse->window); break; case CHOICES_SAVE_BUTTON: vSaveButtonAction(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:695,716 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:847,868 bCloseWindow = TRUE; break; case CHOICES_BREAK_BUTTON: - vSetParagraphBreak(m->w, DEFAULT_SCREEN_WIDTH); + vSetParagraphBreak(pMouse->window, DEFAULT_SCREEN_WIDTH); break; case CHOICES_BREAK_UP_BUTTON: - vChangeParagraphBreak(m->w, 1); + vChangeParagraphBreak(pMouse->window, 1); break; case CHOICES_BREAK_DOWN_BUTTON: - vChangeParagraphBreak(m->w, -1); + vChangeParagraphBreak(pMouse->window, -1); break; case CHOICES_NO_BREAK_BUTTON: - vSetParagraphBreak(m->w, 0); + vSetParagraphBreak(pMouse->window, 0); break; case CHOICES_AUTOFILETYPE_BUTTON: - vChangeAutofiletype(m->w); + vChangeAutofiletype(pMouse->window); break; case CHOICES_HIDDEN_TEXT_BUTTON: - vChangeHiddenText(m->w); + vChangeHiddenText(pMouse->window); break; case CHOICES_WITH_IMAGES_BUTTON: vUseFontsImages(TRUE, TRUE); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:722,761 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:874,924 vUseFontsImages(FALSE, FALSE); break; case CHOICES_SCALE_UP_BUTTON: - vChangeScaleFactor(m->w, 5); + vChangeScaleFactor(pMouse->window, 5); break; case CHOICES_SCALE_DOWN_BUTTON: - vChangeScaleFactor(m->w, -5); + vChangeScaleFactor(pMouse->window, -5); break; default: - DBG_DEC(m->i); + DBG_DEC(pMouse->icon); break; } if (bCloseWindow) { - wimpt_noerr(wimp_close_wind(m->w)); + Error_CheckFatal(Wimp_CloseWindow(pMouse->window)); } - } /* end of vChoicesMouseClick */ + return TRUE; + } /* end of bChoicesMouseClick */ - void - vChoicesKeyPressed(wimp_caretstr *c) + /* + * bChoicesKeyPressed - handle a key in the Choices window + */ + BOOL + bChoicesKeyPressed(event_pollblock *pEvent, void *pvReference) { - wimp_icon tIcon; + icon_block tIcon; + caret_block *pCaret; char *pcChar; int iNumber; - DBG_MSG("vChoicesKeyPressed"); + DBG_MSG("bChoicesKeyPressed"); - fail(c == NULL); + fail(pEvent == NULL); + fail(pEvent->type != event_KEY); - wimpt_noerr(wimp_get_icon_info(c->w, c->i, &tIcon)); - if ((tIcon.flags & (wimp_ITEXT|wimp_INDIRECT)) != - (wimp_ITEXT|wimp_INDIRECT)) { - werr(1, "Icon %d must be indirected text", (int)c->i); - return; + if (pEvent->data.key.code != '\r') { + Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code)); + return TRUE; } + + pCaret = &pEvent->data.key.caret; + + Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon)); + if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) { + werr(1, "Icon %d must be indirected text", (int)pCaret->icon); + } iNumber = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10); - switch(c->i) { + switch(pCaret->icon) { case CHOICES_BREAK_WRITEABLE: if (*pcChar != '\0' && *pcChar != '\r') { DBG_DEC(*pcChar); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:765,771 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:928,934 } else if (iNumber > MAX_SCREEN_WIDTH) { iNumber = MAX_SCREEN_WIDTH; } - vSetParagraphBreak(c->w, iNumber); + vSetParagraphBreak(pCaret->window, iNumber); break; case CHOICES_SCALE_WRITEABLE: if (*pcChar != '\0' && *pcChar != '\r') { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/options.c:776,786 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/options.c:939,950 } else if (iNumber > MAX_SCALE_FACTOR) { iNumber = MAX_SCALE_FACTOR; } - vSetScaleFactor(c->w, iNumber); + vSetScaleFactor(pCaret->window, iNumber); break; default: - DBG_DEC(c->i); + DBG_DEC(pCaret->icon); break; } - } /* end of vChoicesKeyPressed */ + return TRUE; + } /* end of bChoicesKeyPressed */ #endif /* __riscos */ [jmk] --rw-rw-r-- M 499692 jmk sys 24707 Jan 14 12:57 sys/src/cmd/aux/antiword/options.c [jmk] --rw-rw-r-- M 499692 jmk sys 19601 Jan 14 12:57 sys/src/cmd/aux/antiword/out2window.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:1,6 /* * out2window.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GPL * * Description: * Output to a text window /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:11,17 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:11,16 #include #include "antiword.h" - /* Used for numbering the chapters */ static unsigned int auiHdrCounter[9]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:26,31 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:25,32 long lWidth; USHORT usMaxFontSize; + TRACE_MSG("vString2Diagram"); + fail(pDiag == NULL); fail(pAnchor == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:51,56 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:52,58 /* Goto the start of the line */ pDiag->lXleft = 0; + TRACE_MSG("leaving vString2Diagram"); } /* end of vString2Diagram */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:61,66 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:63,70 { long lX; + TRACE_MSG("vSetLeftIndentation"); + fail(pDiag == NULL); fail(lLeftIndentation < 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:81,86 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:85,92 output_type *pTmp; long lNetWidth; + TRACE_MSG("lComputeNetWidth"); + fail(pAnchor == NULL); /* Step 1: Count all but the last sub-string */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:124,129 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:130,137 int iCounter; BOOL bWasSpace, bIsSpace; + TRACE_MSG("iComputeHoles"); + fail(pAnchor == NULL); iCounter = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:143,149 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:151,157 } /* end of iComputeHoles */ /* - * Align a string and insert it into the text + * vAlign2Window - Align a string and insert it into the text */ void vAlign2Window(diagram_type *pDiag, output_type *pAnchor, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:151,161 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:159,169 { long lNetWidth, lLeftIndentation; + TRACE_MSG("vAlign2Window"); + fail(pDiag == NULL || pAnchor == NULL); fail(lScreenWidth < lChar2MilliPoints(MIN_SCREEN_WIDTH)); - NO_DBG_MSG("vAlign2Window"); - lNetWidth = lComputeNetWidth(pAnchor); if (lScreenWidth > lChar2MilliPoints(MAX_SCREEN_WIDTH) || /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:165,170 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:173,179 * Don't bother to align an empty line */ vString2Diagram(pDiag, pAnchor); + TRACE_MSG("leaving vAlign2Window #1"); return; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:189,198 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:198,208 break; } vString2Diagram(pDiag, pAnchor); + TRACE_MSG("leaving vAlign2Window #2"); } /* end of vAlign2Window */ /* - * vJustify2Window + * vJustify2Window - Justify a string and insert it into the text */ void vJustify2Window(diagram_type *pDiag, output_type *pAnchor, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:203,214 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:213,224 long lNetWidth, lSpaceWidth, lToAdd; int iFillerLen, iHoles; + TRACE_MSG("vJustify2Window"); + fail(pDiag == NULL || pAnchor == NULL); fail(lScreenWidth < MIN_SCREEN_WIDTH); fail(lRightIndentation > 0); - NO_DBG_MSG("vJustify2Window"); - if (ucAlignment != ALIGNMENT_JUSTIFY) { vAlign2Window(pDiag, pAnchor, lScreenWidth, ucAlignment); return; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:220,228 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:230,239 lNetWidth <= 0) { /* * Screenwidth is "infinite", so justify is not possible - * Don't bother to align an empty line + * Don't bother to justify an empty line */ vString2Diagram(pDiag, pAnchor); + TRACE_MSG("leaving vJustify2Window #1"); return; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:249,259 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:260,271 DBG_DEC_C(lToAdd < 0, lToAdd); if (lToAdd <= 0) { vString2Diagram(pDiag, pAnchor); + TRACE_MSG("leaving vJustify2Window #2"); return; } - iHoles = iComputeHoles(pAnchor); /* Justify by adding spaces */ + iHoles = iComputeHoles(pAnchor); for (pTmp = pAnchor; pTmp != NULL; pTmp = pTmp->pNext) { fail(pTmp->tNextFree != strlen(pTmp->szStorage)); fail(lToAdd < 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:285,290 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:297,303 } DBG_DEC_C(lToAdd != 0, lToAdd); vString2Diagram(pDiag, pAnchor); + TRACE_MSG("leaving vJustify2Window #3"); } /* end of vJustify2Window */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:293,317 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:306,333 void vResetStyles(void) { + TRACE_MSG("vResetStyles"); + (void)memset(auiHdrCounter, 0, sizeof(auiHdrCounter)); } /* end of vResetStyles */ /* - * Add the style characters to the line + * tStyle2Window - Add the style characters to the line * * Returns the length of the resulting string */ size_t - tStyle2Window(char *szLine, const style_block_type *pStyle, + tStyle2Window(char *szLine, size_t tLineSize, const style_block_type *pStyle, const section_block_type *pSection) { char *pcTxt; - int iIndex; + size_t tIndex, tStyleIndex; BOOL bNeedPrevLvl; level_type_enum eNumType; - USHORT usStyleIndex; UCHAR ucNFC; + TRACE_MSG("tStyle2Window"); + fail(szLine == NULL || pStyle == NULL || pSection == NULL); if (pStyle->usIstd == 0 || pStyle->usIstd > 9) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:319,333 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:335,349 return 0; } - usStyleIndex = pStyle->usIstd - 1; /* Set the numbers */ - for (iIndex = 0; iIndex < 9; iIndex++) { - if (iIndex == (int)usStyleIndex) { - auiHdrCounter[iIndex]++; - } else if (iIndex > (int)usStyleIndex) { - auiHdrCounter[iIndex] = 0; - } else if (auiHdrCounter[iIndex] == 0) { - auiHdrCounter[iIndex] = 1; + tStyleIndex = (size_t)pStyle->usIstd - 1; + for (tIndex = 0; tIndex < 9; tIndex++) { + if (tIndex == tStyleIndex) { + auiHdrCounter[tIndex]++; + } else if (tIndex > tStyleIndex) { + auiHdrCounter[tIndex] = 0; + } else if (auiHdrCounter[tIndex] == 0) { + auiHdrCounter[tIndex] = 1; } } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:337,358 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:353,384 return 0; } - pcTxt = szLine; - bNeedPrevLvl = (pSection->usNeedPrevLvl & BIT(usStyleIndex)) != 0; /* Print the numbers */ - for (iIndex = 0; iIndex <= (int)usStyleIndex; iIndex++) { - if (iIndex == (int)usStyleIndex || - (bNeedPrevLvl && iIndex < (int)usStyleIndex)) { - ucNFC = pSection->aucNFC[iIndex]; + pcTxt = szLine; + bNeedPrevLvl = (pSection->usNeedPrevLvl & BIT(tStyleIndex)) != 0; + for (tIndex = 0; tIndex <= tStyleIndex; tIndex++) { + if (tIndex == tStyleIndex || + (bNeedPrevLvl && tIndex < tStyleIndex)) { + if (pcTxt - szLine >= tLineSize - 25) { + /* Prevent a possible buffer overflow */ + DBG_DEC(pcTxt - szLine); + DBG_DEC(tLineSize - 25); + DBG_FIXME(); + szLine[0] = '\0'; + return 0; + } + ucNFC = pSection->aucNFC[tIndex]; switch(ucNFC) { case LIST_ARABIC_NUM: + case LIST_NUMBER_TXT: + case LIST_ORDINAL_TXT: pcTxt += sprintf(pcTxt, "%u", - auiHdrCounter[iIndex]); + auiHdrCounter[tIndex]); break; case LIST_UPPER_ROMAN: case LIST_LOWER_ROMAN: pcTxt += tNumber2Roman( - auiHdrCounter[iIndex], + auiHdrCounter[tIndex], ucNFC == LIST_UPPER_ROMAN, pcTxt); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:359,378 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:385,408 case LIST_UPPER_ALPHA: case LIST_LOWER_ALPHA: pcTxt += tNumber2Alpha( - auiHdrCounter[iIndex], + auiHdrCounter[tIndex], ucNFC == LIST_UPPER_ALPHA, pcTxt); break; + case LIST_OUTLINE_NUM: + pcTxt += sprintf(pcTxt, "%02u", + auiHdrCounter[tIndex]); + break; default: DBG_DEC(ucNFC); DBG_FIXME(); pcTxt += sprintf(pcTxt, "%u", - auiHdrCounter[iIndex]); + auiHdrCounter[tIndex]); break; } - if (iIndex < (int)usStyleIndex) { + if (tIndex < tStyleIndex) { *pcTxt++ = '.'; - } else if (iIndex == (int)usStyleIndex) { + } else if (tIndex == tStyleIndex) { *pcTxt++ = ' '; } } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:398,409 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:428,441 { int iLastIndex; + TRACE_MSG("vRemoveRowEnd"); + fail(szRowTxt == NULL || szRowTxt[0] == '\0'); iLastIndex = (int)strlen(szRowTxt) - 1; if (szRowTxt[iLastIndex] == TABLE_SEPARATOR || - szRowTxt[iLastIndex] == '\n') { + szRowTxt[iLastIndex] == (char)0x0a) { szRowTxt[iLastIndex] = '\0'; iLastIndex--; } else { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:410,416 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:442,448 DBG_HEX(szRowTxt[iLastIndex]); } - if (iLastIndex >= 0 && szRowTxt[iLastIndex] == '\n') { + if (iLastIndex >= 0 && szRowTxt[iLastIndex] == (char)0x0a) { szRowTxt[iLastIndex] = '\0'; iLastIndex--; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:436,441 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:468,475 const char *pcTmp; size_t tLengthMax, tLenPrev, tLen, tWidth; + TRACE_MSG("tComputeStringLengthMax"); + fail(szString == NULL); fail(tColumnWidthMax == 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:478,483 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:512,519 { int iIndex; + TRACE_MSG("tGetBreakingPoint"); + fail(szString == NULL); fail(tLen > strlen(szString)); fail(tWidth > tColumnWidthMax); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:501,523 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:537,594 } /* end of tGetBreakingPoint */ /* + * tComputeColumnWidthMax - compute the maximum column width + */ + static size_t + tComputeColumnWidthMax(short sWidth, long lCharWidth, double dFactor) + { + size_t tColumnWidthMax; + + TRACE_MSG("tComputeColumnWidthMax"); + + fail(sWidth < 0); + fail(lCharWidth <= 0); + fail(dFactor <= 0.0); + + tColumnWidthMax = (size_t)( + (lTwips2MilliPoints(sWidth) * dFactor + lCharWidth / 2.0) / + lCharWidth); + if (tColumnWidthMax == 0) { + /* Minimum column width */ + return 1; + } + if (tColumnWidthMax > 1) { + /* Make room for the TABLE_SEPARATOR_CHAR */ + tColumnWidthMax--; + } + NO_DBG_DEC(tColumnWidthMax); + return tColumnWidthMax; + } /* end of tComputeColumnWidthMax */ + + /* * vTableRow2Window - put a table row into a diagram */ void vTableRow2Window(diagram_type *pDiag, output_type *pOutput, - const row_block_type *pRowInfo) + const row_block_type *pRowInfo, + conversion_type eConversionType, int iParagraphBreak) { output_type tRow; char *aszColTxt[TABLE_COLUMN_MAX]; char *szLine, *pcTxt; + double dMagnify; long lCharWidthLarge, lCharWidthSmall; + size_t tColumnWidthTotal, atColumnWidthMax[TABLE_COLUMN_MAX]; size_t tSize, tColumnWidthMax, tWidth, tLen; int iIndex, iNbrOfColumns, iTmp; BOOL bNotReady; + TRACE_MSG("vTableRow2Window"); + fail(pDiag == NULL || pOutput == NULL || pRowInfo == NULL); fail(pOutput->szStorage == NULL); fail(pOutput->pNext != NULL); + fail(iParagraphBreak < 0); /* Character sizes */ lCharWidthLarge = lComputeStringWidth("W", 1, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:548,553 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:619,630 NO_DBG_MSG(aszColTxt[iNbrOfColumns]); } + /* Work around a bug in Word */ + while (iNbrOfColumns > (int)pRowInfo->ucNumberOfColumns && + pRowInfo->asColumnWidth[iNbrOfColumns] == 0) { + iNbrOfColumns--; + } + DBG_DEC_C(iNbrOfColumns != (int)pRowInfo->ucNumberOfColumns, iNbrOfColumns); DBG_DEC_C(iNbrOfColumns != (int)pRowInfo->ucNumberOfColumns, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:557,562 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:634,645 return; } + #if defined(__FULL_TEXT_SEARCH) + /* No table formatting: use for full-text search (untested) */ + for (iIndex = 0; iIndex < iNbrOfColumns; iIndex++) { + fprintf(pDiag->pOutFile, "%s\n" , aszColTxt[iIndex]); + } + #else if (bAddTableRow(pDiag, aszColTxt, iNbrOfColumns, pRowInfo->asColumnWidth, pRowInfo->ucBorderInfo)) { /* All work has been done */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:563,575 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:646,681 return; } + /* Fill the table with maximum column widths */ + if (eConversionType == conversion_text || + eConversionType == conversion_fmt_text) { + if (iParagraphBreak == 0 || + iParagraphBreak >= MAX_SCREEN_WIDTH) { + dMagnify = (double)MAX_SCREEN_WIDTH; + } else if (iParagraphBreak <= MIN_SCREEN_WIDTH) { + dMagnify = (double)MIN_SCREEN_WIDTH; + } else { + dMagnify = (double)iParagraphBreak; + } + dMagnify /= (double)DEFAULT_SCREEN_WIDTH; + DBG_FLT_C(dMagnify < 0.99 || dMagnify > 1.01, dMagnify); + } else { + dMagnify = 1.0; + } + tColumnWidthTotal = 0; + for (iIndex = 0; iIndex < iNbrOfColumns; iIndex++) { + atColumnWidthMax[iIndex] = tComputeColumnWidthMax( + pRowInfo->asColumnWidth[iIndex], + lCharWidthLarge, + dMagnify); + tColumnWidthTotal += atColumnWidthMax[iIndex]; + } + /* * Get enough space for the row. * Worst case: three bytes per UTF-8 character */ - tSize = 3 * (size_t)(lTwips2MilliPoints(pRowInfo->iColumnWidthSum) / - lCharWidthSmall + - (long)pRowInfo->ucNumberOfColumns + 3); + tSize = 3 * (1 + tColumnWidthTotal + (size_t)iNbrOfColumns + 3); szLine = xmalloc(tSize); do { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:578,595 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:684,690 pcTxt = szLine; *pcTxt++ = TABLE_SEPARATOR_CHAR; for (iIndex = 0; iIndex < iNbrOfColumns; iIndex++) { - tColumnWidthMax = - (size_t)(lTwips2MilliPoints( - pRowInfo->asColumnWidth[iIndex]) / - lCharWidthLarge); - if (tColumnWidthMax == 0) { - /* Minimum column width */ - tColumnWidthMax = 1; - } else if (tColumnWidthMax > 1) { - /* Make room for the TABLE_SEPARATOR_CHAR */ - tColumnWidthMax--; - } - NO_DBG_DEC(tColumnWidthMax); + tColumnWidthMax = atColumnWidthMax[iIndex]; if (aszColTxt[iIndex] == NULL) { /* Add an empty column */ for (iTmp = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/out2window.c:664,670 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/out2window.c:759,768 tRow.tFontRef, tRow.usFontSize); vString2Diagram(pDiag, &tRow); + TRACE_MSG("after vString2Diagram in vTableRow2Window"); } while (bNotReady); /* Clean up before you leave */ szLine = xfree(szLine); + TRACE_MSG("leaving vTableRow2Window"); + #endif /* __FULL_TEXT_SEARCH */ } /* end of vTableRow2Window */ [jmk] --rw-rw-r-- M 499692 jmk sys 19601 Jan 14 12:57 sys/src/cmd/aux/antiword/out2window.c [jmk] --rw-rw-r-- M 499692 jmk sys 10773 Jan 14 12:57 sys/src/cmd/aux/antiword/output.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:1,6 /* * output.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GPL + * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL * * Description: * Generic output generating functions /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:31,42 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:31,48 case conversion_text: vPrologueTXT(pDiag, &tOptions); break; + case conversion_fmt_text: + vPrologueFMT(pDiag, &tOptions); + break; case conversion_ps: vProloguePS(pDiag, szTask, szFilename, &tOptions); break; case conversion_xml: - vPrologueXML(pDiag); + vPrologueXML(pDiag, &tOptions); break; + case conversion_pdf: + vProloguePDF(pDiag, szTask, &tOptions); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:51,56 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:57,63 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: vEpilogueTXT(pDiag->pOutFile); break; case conversion_ps: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:59,64 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:66,74 case conversion_xml: vEpilogueXML(pDiag); break; + case conversion_pdf: + vEpiloguePDF(pDiag); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:73,78 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:83,89 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: vImageProloguePS(pDiag, pImg); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:79,84 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:90,98 break; case conversion_xml: break; + case conversion_pdf: + vImageProloguePDF(pDiag, pImg); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:93,98 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:107,113 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: vImageEpiloguePS(pDiag); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:99,104 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:114,122 break; case conversion_xml: break; + case conversion_pdf: + vImageEpiloguePDF(pDiag); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:115,125 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:133,146 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: return FALSE; case conversion_ps: return bAddDummyImagePS(pDiag, pImg); case conversion_xml: return FALSE; + case conversion_pdf: + return bAddDummyImagePDF(pDiag, pImg); default: DBG_DEC(eConversionType); return FALSE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:173,185 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:194,211 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: vAddFontsPS(pDiag); break; case conversion_xml: - vCreateBookIntro(pDiag, iWordVersion, eEncoding); + vCreateBookIntro(pDiag, iWordVersion); break; + case conversion_pdf: + vCreateInfoDictionary(pDiag, iWordVersion); + vAddFontsPDF(pDiag); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:190,196 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:216,223 * vMove2NextLine - move to the next line */ void - vMove2NextLine(diagram_type *pDiag, draw_fontref tFontRef, USHORT usFontSize) + vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef, + USHORT usFontSize) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:198,203 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:225,231 switch (eConversionType) { case conversion_text: + case conversion_fmt_text: vMove2NextLineTXT(pDiag); break; case conversion_ps: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:206,211 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:234,242 case conversion_xml: vMove2NextLineXML(pDiag); break; + case conversion_pdf: + vMove2NextLinePDF(pDiag, usFontSize); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:218,224 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:249,255 void vSubstring2Diagram(diagram_type *pDiag, char *szString, size_t tStringLength, long lStringWidth, - UCHAR ucFontColor, USHORT usFontstyle, draw_fontref tFontRef, + UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef, USHORT usFontSize, USHORT usMaxFontSize) { switch (eConversionType) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:225,230 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:256,265 case conversion_text: vSubstringTXT(pDiag, szString, tStringLength, lStringWidth); break; + case conversion_fmt_text: + vSubstringFMT(pDiag, szString, tStringLength, lStringWidth, + usFontstyle); + break; case conversion_ps: vSubstringPS(pDiag, szString, tStringLength, lStringWidth, ucFontColor, usFontstyle, tFontRef, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:234,239 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:269,279 vSubstringXML(pDiag, szString, tStringLength, lStringWidth, usFontstyle); break; + case conversion_pdf: + vSubstringPDF(pDiag, szString, tStringLength, lStringWidth, + ucFontColor, usFontstyle, tFontRef, + usFontSize, usMaxFontSize); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:252,257 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:292,298 switch (eConversionType) { case conversion_text: + case conversion_fmt_text: vStartOfParagraphTXT(pDiag, lBeforeIndentation); break; case conversion_ps: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:259,264 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:300,308 break; case conversion_xml: break; + case conversion_pdf: + vStartOfParagraphPDF(pDiag, lBeforeIndentation); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:276,281 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:320,326 switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:282,287 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:327,334 case conversion_xml: vStartOfParagraphXML(pDiag, 1); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:293,299 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:340,346 */ void vEndOfParagraph(diagram_type *pDiag, - draw_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) + drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:302,316 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:349,366 switch (eConversionType) { case conversion_text: + case conversion_fmt_text: vEndOfParagraphTXT(pDiag, lAfterIndentation); break; case conversion_ps: - vEndOfParagraphPS(pDiag, - tFontRef, usFontSize, lAfterIndentation); + vEndOfParagraphPS(pDiag, usFontSize, lAfterIndentation); break; case conversion_xml: vEndOfParagraphXML(pDiag, 1); break; + case conversion_pdf: + vEndOfParagraphPDF(pDiag, usFontSize, lAfterIndentation); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:321,338 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:371,392 * Create an end of page */ void - vEndOfPage(diagram_type *pDiag, long lAfterIndentation) + vEndOfPage(diagram_type *pDiag, long lAfterIndentation, BOOL bNewSection) { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: vEndOfPageTXT(pDiag, lAfterIndentation); break; case conversion_ps: - vEndOfPagePS(pDiag); + vEndOfPagePS(pDiag, bNewSection); break; case conversion_xml: vEndOfPageXML(pDiag); break; + case conversion_pdf: + vEndOfPagePDF(pDiag, bNewSection); + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:347,352 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:401,407 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:353,358 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:408,415 case conversion_xml: vSetHeadersXML(pDiag, usIstd); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:367,372 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:424,430 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:373,378 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:431,438 case conversion_xml: vStartOfListXML(pDiag, ucNFC, bIsEndOfTable); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:387,392 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:447,453 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:393,398 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:454,461 case conversion_xml: vEndOfListXML(pDiag); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:407,412 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:470,476 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:413,418 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:477,484 case conversion_xml: vStartOfListItemXML(pDiag, bNoMarks); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:427,432 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:493,499 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:433,438 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:500,507 case conversion_xml: vEndOfTableXML(pDiag); break; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:450,455 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:519,525 { switch (eConversionType) { case conversion_text: + case conversion_fmt_text: break; case conversion_ps: break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/output.c:458,463 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/output.c:528,535 iNbrOfColumns, asColumnWidth, ucBorderInfo); return TRUE; + case conversion_pdf: + break; default: DBG_DEC(eConversionType); break; [jmk] --rw-rw-r-- M 499692 jmk sys 10773 Jan 14 12:57 sys/src/cmd/aux/antiword/output.c [jmk] --rw-rw-r-- M 499692 jmk sys 31661 Jan 14 12:57 sys/src/cmd/aux/antiword/pdf.c [jmk] --rw-rw-r-- M 499692 jmk sys 2512 Jan 14 12:57 sys/src/cmd/aux/antiword/pictlist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:1,6 /* * pictlist.c - * Copyright (C) 2000,2001 A.J. van Os; Released under GPL + * Copyright (C) 2000-2004 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy a list of Word picture information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:10,18 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:10,27 #include "antiword.h" + /* + * Private structure to hide the way the information + * is stored from the rest of the program + */ + typedef struct picture_mem_tag { + picture_block_type tInfo; + struct picture_mem_tag *pNext; + } picture_mem_type; + /* Variables needed to write the Picture Information List */ - static picture_desc_type *pAnchor = NULL; - static picture_desc_type *pPictureLast = NULL; + static picture_mem_type *pAnchor = NULL; + static picture_mem_type *pPictureLast = NULL; /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:21,27 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:30,36 void vDestroyPictInfoList(void) { - picture_desc_type *pCurr, *pNext; + picture_mem_type *pCurr, *pNext; DBG_MSG("vDestroyPictInfoList"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:43,49 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:52,58 void vAdd2PictInfoList(const picture_block_type *pPictureBlock) { - picture_desc_type *pListMember; + picture_mem_type *pListMember; fail(pPictureBlock == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:69,75 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:78,84 NO_DBG_HEX(pPictureBlock->ulPictureOffset); /* Create list member */ - pListMember = xmalloc(sizeof(picture_desc_type)); + pListMember = xmalloc(sizeof(picture_mem_type)); /* Fill the list member */ pListMember->tInfo = *pPictureBlock; pListMember->pNext = NULL; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/pictlist.c:89,95 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/pictlist.c:98,104 ULONG ulGetPictInfoListItem(ULONG ulFileOffset) { - picture_desc_type *pCurr; + picture_mem_type *pCurr; for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { if (pCurr->tInfo.ulFileOffset == ulFileOffset) { [jmk] --rw-rw-r-- M 499692 jmk sys 2512 Jan 14 12:57 sys/src/cmd/aux/antiword/pictlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 4032 Jan 14 12:57 sys/src/cmd/aux/antiword/png2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 4032 Jan 14 12:57 sys/src/cmd/aux/antiword/png2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 572 Jan 14 12:57 sys/src/cmd/aux/antiword/png2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 572 Jan 14 12:57 sys/src/cmd/aux/antiword/png2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 33883 Jan 14 12:57 sys/src/cmd/aux/antiword/postscript.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1,6 /* * postscript.c - * Copyright (C) 1999-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1999-2005 A.J. van Os; Released under GNU GPL * * Description: * Functions to deal with the PostScript format /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:29,40 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:29,44 /* The height and width of a PostScript page (in DrawUnits) */ static long lPageHeight = LONG_MAX; static long lPageWidth = LONG_MAX; + /* The height of the footer on the current page (in DrawUnits) */ + static long lFooterHeight = 0; + /* Inside a footer (to prevent an infinite loop when the footer is too big) */ + static BOOL bInFtrSpace = FALSE; /* Current time for a PS header */ static const char *szCreationDate = NULL; /* Current creator for a PS header */ static const char *szCreator = NULL; /* Current font information */ - static draw_fontref tFontRefCurr = (draw_fontref)-1; + static drawfile_fontref tFontRefCurr = (drawfile_fontref)-1; static USHORT usFontSizeCurr = 0; static int iFontColorCurr = -1; /* Current vertical position information */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:43,49 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:47,59 static int iPageCount = 0; /* Image counter */ static int iImageCount = 0; + /* Section index */ + static int iSectionIndex = 0; + /* Are we on the first page of the section? */ + static BOOL bFirstInSection = TRUE; + static void vMoveTo(diagram_type *, long); + static const char *iso_8859_1_data[] = { "/newcodes % ISO-8859-1 character encodings", "[", /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:103,108 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:113,147 "", }; + static const char *iso_8859_5_data[] = { + "/newcodes % ISO-8859-5 character encodings", + "[", + "160/space 161/afii10023 162/afii10051 163/afii10052 164/afii10053", + "165/afii10054 166/afii10055 167/afii10056 168/afii10057 169/afii10058", + "170/afii10059 171/afii10060 172/afii10061 173/hyphen 174/afii10062", + "175/afii10145 176/afii10017 177/afii10018 178/afii10019 179/afii10020", + "180/afii10021 181/afii10022 182/afii10024 183/afii10025 184/afii10026", + "185/afii10027 186/afii10028 187/afii10029 188/afii10030 189/afii10031", + "190/afii10032 191/afii10033 192/afii10034 193/afii10035 194/afii10036", + "195/afii10037 196/afii10038 197/afii10039 198/afii10040 199/afii10041", + "200/afii10042 201/afii10043 202/afii10044 203/afii10045 204/afii10046", + "205/afii10047 206/afii10048 207/afii10049 208/afii10065 209/afii10066", + "210/afii10067 211/afii10068 212/afii10069 213/afii10070 214/afii10072", + "215/afii10073 216/afii10074 217/afii10075 218/afii10076 219/afii10077", + "220/afii10078 221/afii10079 222/afii10080 223/afii10081 224/afii10082", + "225/afii10083 226/afii10084 227/afii10085 228/afii10086 229/afii10087", + "230/afii10088 231/afii10089 232/afii10090 233/afii10091 234/afii10092", + "235/afii10093 236/afii10094 237/afii10095 238/afii10096 239/afii10097", + "240/afii61352 241/afii10071 242/afii10099 243/afii10100 244/afii10101", + "245/afii10102 246/afii10103 247/afii10104 248/afii10105 249/afii10106", + "250/afii10107 251/afii10108 252/afii10109 253/section 254/afii10110", + "255/afii10193", + "] bind def", + "", + "/reencdict 12 dict def", + "", + }; + static const char *iso_8859_x_func[] = { "% change fonts using ISO-8859-x characters", "/ChgFnt % size psname natname => font", /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:191,230 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:230,451 } /* end of vAddPageSetup */ /* + * vAddHdrFtr - add a header or footer + */ + static void + vAddHdrFtr(diagram_type *pDiag, const hdrftr_block_type *pHdrFtrInfo) + { + output_type *pStart, *pPrev, *pNext; + + fail(pDiag == NULL); + fail(pHdrFtrInfo == NULL); + + vStartOfParagraphPS(pDiag, 0); + pStart = pHdrFtrInfo->pText; + while (pStart != NULL) { + pNext = pStart; + while (pNext != NULL && + (pNext->tNextFree != 1 || + (pNext->szStorage[0] != PAR_END && + pNext->szStorage[0] != HARD_RETURN))) { + pNext = pNext->pNext; + } + if (pNext == NULL) { + if (bOutputContainsText(pStart)) { + vAlign2Window(pDiag, pStart, + lChar2MilliPoints(DEFAULT_SCREEN_WIDTH), + ALIGNMENT_LEFT); + } else { + vMove2NextLinePS(pDiag, pStart->usFontSize); + } + break; + } + fail(pNext->tNextFree != 1); + fail(pNext->szStorage[0] != PAR_END && + pNext->szStorage[0] != HARD_RETURN); + + if (pStart != pNext) { + /* There is something to print */ + pPrev = pNext->pPrev; + fail(pPrev->pNext != pNext); + /* Cut the chain */ + pPrev->pNext = NULL; + if (bOutputContainsText(pStart)) { + /* Print it */ + vAlign2Window(pDiag, pStart, + lChar2MilliPoints(DEFAULT_SCREEN_WIDTH), + ALIGNMENT_LEFT); + } else { + /* Just an empty line */ + vMove2NextLinePS(pDiag, pStart->usFontSize); + } + /* Repair the chain */ + pPrev->pNext = pNext; + } + if (pNext->szStorage[0] == PAR_END) { + vEndOfParagraphPS(pDiag, pNext->usFontSize, + (long)pNext->usFontSize * 200); + } + pStart = pNext->pNext; + } + } /* end of vAddHdrFtr */ + + /* + * vAddHeader - add a page header + */ + static void + vAddHeader(diagram_type *pDiag) + { + const hdrftr_block_type *pHdrInfo; + const hdrftr_block_type *pFtrInfo; + + fail(pDiag == NULL); + + NO_DBG_MSG("vAddHeader"); + + pHdrInfo = pGetHdrFtrInfo(iSectionIndex, TRUE, + odd(iPageCount), bFirstInSection); + pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE, + odd(iPageCount), bFirstInSection); + /* Set the height of the footer of this page */ + lFooterHeight = pFtrInfo == NULL ? 0 : pFtrInfo->lHeight; + fail(lFooterHeight < 0); + + if (pHdrInfo == NULL || + pHdrInfo->pText == NULL || + pHdrInfo->lHeight <= 0) { + fail(pHdrInfo != NULL && pHdrInfo->lHeight < 0); + fail(pHdrInfo != NULL && + pHdrInfo->pText != NULL && + pHdrInfo->lHeight == 0); + return; + } + + vAddHdrFtr(pDiag, pHdrInfo); + + DBG_DEC_C(pHdrInfo->lHeight != + lPageHeight - PS_TOP_MARGIN - pDiag->lYtop, + pHdrInfo->lHeight); + DBG_DEC_C(pHdrInfo->lHeight != + lPageHeight - PS_TOP_MARGIN - pDiag->lYtop, + lPageHeight - PS_TOP_MARGIN - pDiag->lYtop); + + #if 0 /* defined(DEBUG) */ + fprintf(pDiag->pOutFile, + "(HEADER: FileOffset 0x%04lx-0x%04lx; Height %ld-%ld) show\n", + ulCharPos2FileOffset(pHdrInfo->ulCharPosStart), + ulCharPos2FileOffset(pHdrInfo->ulCharPosNext), + pHdrInfo->lHeight, + lPageHeight - PS_TOP_MARGIN - pDiag->lYtop); + #endif + } /* end of vAddHeader */ + + /* + * vAddFooter - add a page footer + */ + static void + vAddFooter(diagram_type *pDiag) + { + const hdrftr_block_type *pFtrInfo; + + fail(pDiag == NULL); + + NO_DBG_MSG("vAddFooter"); + pFtrInfo = pGetHdrFtrInfo(iSectionIndex, FALSE, + odd(iPageCount), bFirstInSection); + bFirstInSection = FALSE; + if (pFtrInfo == NULL || + pFtrInfo->pText == NULL || + pFtrInfo->lHeight <= 0) { + fail(pFtrInfo != NULL && pFtrInfo->lHeight < 0); + fail(pFtrInfo != NULL && + pFtrInfo->pText != NULL && + pFtrInfo->lHeight == 0); + return; + } + + bInFtrSpace = TRUE; + + DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, pFtrInfo->lHeight); + DBG_DEC_C(pFtrInfo->lHeight != lFooterHeight, lFooterHeight); + DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, + pDiag->lYtop); + DBG_DEC_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, + lFooterHeight + PS_BOTTOM_MARGIN); + + if (pDiag->lYtop > lFooterHeight + PS_BOTTOM_MARGIN) { + /* Move down to the start of the footer */ + pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN; + vMoveTo(pDiag, 0); + } else if (pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN / 2) { + DBG_FIXME(); + /* + * Move up to the start of the footer, to prevent moving + * of the bottom edge of the paper + */ + pDiag->lYtop = lFooterHeight + PS_BOTTOM_MARGIN; + vMoveTo(pDiag, 0); + } + + DBG_FLT_C(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN, + dDrawUnits2Points(lFooterHeight + PS_BOTTOM_MARGIN - pDiag->lYtop)); + + #if 0 /* defined(DEBUG) */ + fprintf(pDiag->pOutFile, + "(FOOTER: FileOffset 0x%04lx-0x%04lx; Bottom %ld-%ld) show\n", + ulCharPos2FileOffset(pFtrInfo->ulCharPosStart), + ulCharPos2FileOffset(pFtrInfo->ulCharPosNext), + pDiag->lYtop, + pFtrInfo->lHeight + PS_BOTTOM_MARGIN); + #endif + vAddHdrFtr(pDiag, pFtrInfo); + bInFtrSpace = FALSE; + } /* end of vAddFooter */ + + /* * vMove2NextPage - move to the start of the next page */ static void - vMove2NextPage(diagram_type *pDiag) + vMove2NextPage(diagram_type *pDiag, BOOL bNewSection) { fail(pDiag == NULL); + vAddFooter(pDiag); fprintf(pDiag->pOutFile, "showpage\n"); iPageCount++; fprintf(pDiag->pOutFile, "%%%%Page: %d %d\n", iPageCount, iPageCount); + if (bNewSection) { + iSectionIndex++; + bFirstInSection = TRUE; + } vAddPageSetup(pDiag->pOutFile); pDiag->lYtop = lPageHeight - PS_TOP_MARGIN; lYtopCurr = -1; + vAddHeader(pDiag); } /* end of vMove2NextPage */ /* - * vMoveToPS - move to the specified X,Y coordinates + * vMoveTo - move to the specified X,Y coordinates * * Move the current position of the specified diagram to its X,Y coordinates, * start on a new page if needed */ static void - vMoveToPS(diagram_type *pDiag, long lLastVerticalMovement) + vMoveTo(diagram_type *pDiag, long lLastVerticalMovement) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); - if (pDiag->lYtop < PS_BOTTOM_MARGIN) { - vMove2NextPage(pDiag); + if (pDiag->lYtop <= lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace) { + vMove2NextPage(pDiag, FALSE); /* Repeat the last vertical movement on the new page */ pDiag->lYtop -= lLastVerticalMovement; } - fail(pDiag->lYtop < PS_BOTTOM_MARGIN); + fail(pDiag->lYtop < lFooterHeight + PS_BOTTOM_MARGIN && !bInFtrSpace); + DBG_DEC_C(pDiag->lYtop < PS_BOTTOM_MARGIN, pDiag->lYtop); + fail(pDiag->lYtop < PS_BOTTOM_MARGIN / 3); + if (pDiag->lYtop != lYtopCurr) { fprintf(pDiag->pOutFile, "%.2f %.2f moveto\n", dDrawUnits2Points(pDiag->lXleft + PS_LEFT_MARGIN), /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:231,237 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:452,458 dDrawUnits2Points(pDiag->lYtop)); lYtopCurr = pDiag->lYtop; } - } /* end of vMoveToPS */ + } /* end of vMoveTo */ /* * vProloguePS - set options and perform the PostScript initialization /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:268,279 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:489,505 lPageWidth = lPoints2DrawUnits(pOptions->iPageWidth); } DBG_DEC(lPageWidth); - tFontRefCurr = (draw_fontref)-1; + lFooterHeight = 0; + bInFtrSpace = FALSE; + + tFontRefCurr = (drawfile_fontref)-1; usFontSizeCurr = 0; iFontColorCurr = -1; lYtopCurr = -1; - iImageCount = 0; iPageCount = 0; + iImageCount = 0; + iSectionIndex = 0; + bFirstInSection = TRUE; pDiag->lXleft = 0; pDiag->lYtop = lPageHeight - PS_TOP_MARGIN; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:324,329 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:550,556 fail(pDiag->pOutFile == NULL); if (pDiag->lYtop < lPageHeight - PS_TOP_MARGIN) { + vAddFooter(pDiag); fprintf(pDiag->pOutFile, "showpage\n"); } fprintf(pDiag->pOutFile, "%%%%Trailer\n"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:393,399 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:620,626 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft); pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled); - vMoveToPS(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); + vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); pOutFile = pDiag->pOutFile; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:454,460 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:681,687 fprintf(pOutFile, "/Data Data1 << >> /FlateDecode filter def\n"); } - if (pImg->iComponents == 3) { + if (pImg->iComponents == 3 || pImg->iComponents == 4) { fprintf(pOutFile, "/DeviceRGB setcolorspace\n"); } else if (pImg->iColorsUsed > 0) { vPrintPalette(pOutFile, pImg); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:613,619 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:840,846 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft); pDiag->lYtop -= lPoints2DrawUnits(pImg->iVerSizeScaled); - vMoveToPS(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); + vMoveTo(pDiag, lPoints2DrawUnits(pImg->iVerSizeScaled)); pOutFile = pDiag->pOutFile; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:645,651 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:872,878 FILE *pOutFile; const font_table_type *pTmp, *pTmp2; size_t tIndex; - int iLineLen; + int iLineLen, iOurFontnameLen; BOOL bFound; fail(pDiag == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:670,679 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:897,907 break; } } - if (bFound) { + iOurFontnameLen = (int)strlen(pTmp->szOurFontname); + if (bFound || iOurFontnameLen <= 0) { continue; } - if (iLineLen + (int)strlen(pTmp->szOurFontname) > 78) { + if (iLineLen + iOurFontnameLen > 76) { fprintf(pOutFile, "\n%%%%+"); iLineLen = 3; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:687,693 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:915,921 fprintf(pOutFile, "%%%%BeginProlog\n"); switch (eEncoding) { - case encoding_iso_8859_1: + case encoding_latin_1: for (tIndex = 0; tIndex < elementsof(iso_8859_1_data); tIndex++) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:700,706 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:928,934 fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); } break; - case encoding_iso_8859_2: + case encoding_latin_2: for (tIndex = 0; tIndex < elementsof(iso_8859_2_data); tIndex++) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:713,719 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:941,960 fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); } break; - case encoding_utf8: + case encoding_cyrillic: + for (tIndex = 0; + tIndex < elementsof(iso_8859_5_data); + tIndex++) { + fprintf(pOutFile, "%s\n", iso_8859_5_data[tIndex]); + } + fprintf(pOutFile, "\n"); + for (tIndex = 0; + tIndex < elementsof(iso_8859_x_func); + tIndex++) { + fprintf(pOutFile, "%s\n", iso_8859_x_func[tIndex]); + } + break; + case encoding_utf_8: werr(1, "The combination PostScript and UTF-8 is not supported"); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:730,735 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:971,977 iPageCount = 1; fprintf(pDiag->pOutFile, "%%%%Page: %d %d\n", iPageCount, iPageCount); vAddPageSetup(pDiag->pOutFile); + vAddHeader(pDiag); } /* end of vAddFontsPS */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:849,855 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1091,1097 void vSubstringPS(diagram_type *pDiag, char *szString, size_t tStringLength, long lStringWidth, - UCHAR ucFontColor, USHORT usFontstyle, draw_fontref tFontRef, + UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef, USHORT usFontSize, USHORT usMaxFontSize) { const char *szOurFontname; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:880,886 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1122,1128 vSetColor(pDiag->pOutFile, ucFontColor); iFontColorCurr = (int)ucFontColor; } - vMoveToPS(pDiag, lComputeLeading(usMaxFontSize)); + vMoveTo(pDiag, lComputeLeading(usMaxFontSize)); vPrintPS(pDiag->pOutFile, szString, tStringLength, usFontstyle); pDiag->lXleft += lStringWidth; } /* end of vSubstringPS */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:903,909 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1145,1151 */ void vEndOfParagraphPS(diagram_type *pDiag, - draw_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) + USHORT usFontSize, long lAfterIndentation) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:912,918 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1154,1160 if (pDiag->lXleft > 0) { /* To the start of the line */ - vMove2NextLine(pDiag, tFontRef, usFontSize); + vMove2NextLinePS(pDiag, usFontSize); } pDiag->lXleft = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/postscript.c:923,929 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/postscript.c:1165,1171 * Create an end of page */ void - vEndOfPagePS(diagram_type *pDiag) + vEndOfPagePS(diagram_type *pDiag, BOOL bNewSection) { - vMove2NextPage(pDiag); + vMove2NextPage(pDiag, bNewSection); } /* end of vEndOfPagePS */ [jmk] --rw-rw-r-- M 499692 jmk sys 33883 Jan 14 12:57 sys/src/cmd/aux/antiword/postscript.c [jmk] --rw-rw-r-- M 499692 jmk sys 12600 Jan 14 12:57 sys/src/cmd/aux/antiword/prop0.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:1,6 /* * prop0.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GPL + * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL * * Description: * Read the property information from a Word for DOS file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:7,16 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:7,135 */ #include + #include #include "antiword.h" /* + * tConvertDosDate - convert DOS date format + * + * returns Unix time_t or -1 + */ + static time_t + tConvertDosDate(const char *szDosDate) + { + struct tm tTime; + const char *pcTmp; + time_t tResult; + + memset(&tTime, 0, sizeof(tTime)); + pcTmp = szDosDate; + /* Get the month */ + if (!isdigit(*pcTmp)) { + return (time_t)-1; + } + tTime.tm_mon = (int)(*pcTmp - '0'); + pcTmp++; + if (isdigit(*pcTmp)) { + tTime.tm_mon *= 10; + tTime.tm_mon += (int)(*pcTmp - '0'); + pcTmp++; + } + /* Get the first separater */ + if (isalnum(*pcTmp)) { + return (time_t)-1; + } + pcTmp++; + /* Get the day */ + if (!isdigit(*pcTmp)) { + return (time_t)-1; + } + tTime.tm_mday = (int)(*pcTmp - '0'); + pcTmp++; + if (isdigit(*pcTmp)) { + tTime.tm_mday *= 10; + tTime.tm_mday += (int)(*pcTmp - '0'); + pcTmp++; + } + /* Get the second separater */ + if (isalnum(*pcTmp)) { + return (time_t)-1; + } + pcTmp++; + /* Get the year */ + if (!isdigit(*pcTmp)) { + return (time_t)-1; + } + tTime.tm_year = (int)(*pcTmp - '0'); + pcTmp++; + if (isdigit(*pcTmp)) { + tTime.tm_year *= 10; + tTime.tm_year += (int)(*pcTmp - '0'); + pcTmp++; + } + /* Check the values */ + if (tTime.tm_mon == 0 || tTime.tm_mday == 0 || tTime.tm_mday > 31) { + return (time_t)-1; + } + /* Correct the values */ + tTime.tm_mon--; /* From 01-12 to 00-11 */ + if (tTime.tm_year < 80) { + tTime.tm_year += 100; /* 00 means 2000 is 100 */ + } + tTime.tm_isdst = -1; + tResult = mktime(&tTime); + NO_DBG_MSG(ctime(&tResult)); + return tResult; + } /* end of tConvertDosDate */ + + /* + * Build the lists with Document Property Information for Word for DOS files + */ + void + vGet0DopInfo(FILE *pFile, const UCHAR *aucHeader) + { + document_block_type tDocument; + UCHAR *aucBuffer; + ULONG ulBeginSumdInfo, ulBeginNextBlock; + size_t tLen; + USHORT usOffset; + + tDocument.ucHdrFtrSpecification = 0; + tDocument.usDefaultTabWidth = usGetWord(0x70, aucHeader); /* dxaTab */ + tDocument.tCreateDate = (time_t)-1; + tDocument.tRevisedDate = (time_t)-1; + + ulBeginSumdInfo = 128 * (ULONG)usGetWord(0x1c, aucHeader); + DBG_HEX(ulBeginSumdInfo); + ulBeginNextBlock = 128 * (ULONG)usGetWord(0x6a, aucHeader); + DBG_HEX(ulBeginNextBlock); + + if (ulBeginSumdInfo < ulBeginNextBlock && ulBeginNextBlock != 0) { + /* There is a summary information block */ + tLen = (size_t)(ulBeginNextBlock - ulBeginSumdInfo); + aucBuffer = xmalloc(tLen); + /* Read the summary information block */ + if (bReadBytes(aucBuffer, tLen, ulBeginSumdInfo, pFile)) { + usOffset = usGetWord(12, aucBuffer); + if (aucBuffer[usOffset] != 0) { + NO_DBG_STRN(aucBuffer + usOffset, 8); + tDocument.tRevisedDate = + tConvertDosDate((char *)aucBuffer + usOffset); + } + usOffset = usGetWord(14, aucBuffer); + if (aucBuffer[usOffset] != 0) { + NO_DBG_STRN(aucBuffer + usOffset, 8); + tDocument.tCreateDate = + tConvertDosDate((char *)aucBuffer + usOffset); + } + } + aucBuffer = xfree(aucBuffer); + } + vCreateDocumentInfoList(&tDocument); + } /* end of vGet0DopInfo */ + + /* * Fill the section information block with information * from a Word for DOS file. */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:48,61 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:167,181 { section_block_type tSection; UCHAR *aucBuffer; - ULONG ulBeginSectInfo, ulBeginNextBlock; - ULONG ulSectPage, ulTextOffset; - size_t tSectInfoLen, tBytes; - int iIndex, iSections; + ULONG ulBeginOfText, ulTextOffset, ulBeginSectInfo; + ULONG ulCharPos, ulSectPage, ulBeginNextBlock; + size_t tSectInfoLen, tIndex, tSections, tBytes; UCHAR aucTmp[2], aucFpage[35]; fail(pFile == NULL || aucHeader == NULL); + ulBeginOfText = 128; + NO_DBG_HEX(ulBeginOfText); ulBeginSectInfo = 128 * (ULONG)usGetWord(0x18, aucHeader); DBG_HEX(ulBeginSectInfo); ulBeginNextBlock = 128 * (ULONG)usGetWord(0x1a, aucHeader); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:69,79 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:189,199 if (!bReadBytes(aucTmp, 2, ulBeginSectInfo, pFile)) { return; } - iSections = (int)usGetWord(0, aucTmp); - NO_DBG_DEC(iSections); + tSections = (size_t)usGetWord(0, aucTmp); + NO_DBG_DEC(tSections); /* Read the Section Descriptors */ - tSectInfoLen = 10 * (size_t)iSections; + tSectInfoLen = 10 * tSections; NO_DBG_DEC(tSectInfoLen); aucBuffer = xmalloc(tSectInfoLen); if (!bReadBytes(aucBuffer, tSectInfoLen, ulBeginSectInfo + 4, pFile)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:83,98 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:203,220 NO_DBG_PRINT_BLOCK(aucBuffer, tSectInfoLen); /* Read the Section Properties */ - for (iIndex = 0; iIndex < iSections; iIndex++) { - ulTextOffset = ulGetLong(10 * iIndex, aucBuffer); + for (tIndex = 0; tIndex < tSections; tIndex++) { + ulTextOffset = ulGetLong(10 * tIndex, aucBuffer); NO_DBG_HEX(ulTextOffset); - ulSectPage = ulGetLong(10 * iIndex + 6, aucBuffer); + ulCharPos = ulBeginOfText + ulTextOffset; + NO_DBG_HEX(ulTextOffset); + ulSectPage = ulGetLong(10 * tIndex + 6, aucBuffer); NO_DBG_HEX(ulSectPage); if (ulSectPage == FC_INVALID || /* Must use defaults */ ulSectPage < 128 || /* Should not happen */ ulSectPage >= ulBeginSectInfo) { /* Should not happen */ DBG_HEX_C(ulSectPage != FC_INVALID, ulSectPage); - vDefault2SectionInfoList(ulTextOffset); + vDefault2SectionInfoList(ulCharPos); continue; } /* Get the number of bytes to read */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:101,107 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:223,228 } tBytes = 1 + (size_t)ucGetByte(0, aucTmp); NO_DBG_DEC(tBytes); - fail(tBytes > sizeof(aucFpage)); if (tBytes > sizeof(aucFpage)) { DBG_DEC(tBytes); tBytes = sizeof(aucFpage); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:114,120 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:235,241 /* Process the bytes */ vGetDefaultSection(&tSection); vGet0SectionInfo(aucFpage + 1, tBytes - 1, &tSection); - vAdd2SectionInfoList(&tSection, ulTextOffset); + vAdd2SectionInfoList(&tSection, ulCharPos); } /* Clean up before you leave */ aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop0.c:268,274 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop0.c:389,395 return; } /* cHps */ - pFont->usFontSize = ucGetByte(iFodo + 3, aucGrpprl); + pFont->usFontSize = (USHORT)ucGetByte(iFodo + 3, aucGrpprl); NO_DBG_DEC(pFont->usFontSize); if (iBytes < 4) { return; [jmk] --rw-rw-r-- M 499692 jmk sys 12600 Jan 14 12:57 sys/src/cmd/aux/antiword/prop0.c [jmk] --rw-rw-r-- M 499692 jmk sys 28409 Jan 14 12:57 sys/src/cmd/aux/antiword/prop2.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:1,6 /* * prop2.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GPL + * Copyright (C) 2002-2005 A.J. van Os; Released under GPL * * Description: * Read the property information from a WinWord 1 or 2 file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:10,15 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:10,17 #include "antiword.h" + #define MAX_FILESIZE 0x2000000UL /* 32 Mb */ + /* * iGet2InfoLength - the length of the information for WinWord 1/2 files */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:54,59 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:56,100 } /* end of iGet2InfoLength */ /* + * Build the lists with Document Property Information for WinWord 1/2 files + */ + void + vGet2DopInfo(FILE *pFile, const UCHAR *aucHeader) + { + document_block_type tDocument; + UCHAR *aucBuffer; + ULONG ulBeginDocpInfo, ulTmp; + size_t tDocpInfoLen; + USHORT usTmp; + + ulBeginDocpInfo = ulGetLong(0x112, aucHeader); /* fcDop */ + DBG_HEX(ulBeginDocpInfo); + tDocpInfoLen = (size_t)usGetWord(0x116, aucHeader); /* cbDop */ + DBG_DEC(tDocpInfoLen); + if (tDocpInfoLen < 28) { + DBG_MSG("No Document information"); + return; + } + + aucBuffer = xmalloc(tDocpInfoLen); + if (!bReadBytes(aucBuffer, tDocpInfoLen, ulBeginDocpInfo, pFile)) { + aucBuffer = xfree(aucBuffer); + return; + } + + usTmp = usGetWord(0x00, aucBuffer); + tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */ + tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */ + ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ + tDocument.tCreateDate = tConvertDTTM(ulTmp); + ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ + tDocument.tRevisedDate = tConvertDTTM(ulTmp); + vCreateDocumentInfoList(&tDocument); + + aucBuffer = xfree(aucBuffer); + } /* end of vGet2DopInfo */ + + /* * Fill the section information block with information * from a WinWord 1/2 file. */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:79,84 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:120,129 usCcol = 1 + usGetWord(iFodoOff + 1, aucGrpprl); DBG_DEC(usCcol); break; + case 128: /* grpfIhdt */ + pSection->ucHdrFtrSpecification = + ucGetByte(iFodoOff + 1, aucGrpprl); + break; default: break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:95,109 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:140,155 vGet2SepInfo(FILE *pFile, const UCHAR *aucHeader) { section_block_type tSection; - ULONG *aulSectPage, *aulTextOffset; + ULONG *aulSectPage, *aulCharPos; UCHAR *aucBuffer, *aucFpage; - ULONG ulBeginSectInfo; - size_t tSectInfoLen, tOffset, tLen, tBytes; - int iIndex; + ULONG ulBeginOfText, ulTextOffset, ulBeginSectInfo; + size_t tSectInfoLen, tIndex, tOffset, tLen, tBytes; UCHAR aucTmp[1]; fail(pFile == NULL || aucHeader == NULL); + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ + NO_DBG_HEX(ulBeginOfText); ulBeginSectInfo = ulGetLong(0x7c, aucHeader); /* fcPlcfsed */ DBG_HEX(ulBeginSectInfo); tSectInfoLen = (size_t)usGetWord(0x80, aucHeader); /* cbPlcfsed */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:123,152 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:169,201 /* Read the Section Descriptors */ tLen = (tSectInfoLen - 4) / 10; /* Save the section offsets */ - aulTextOffset = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = 0; - iIndex < (int)tLen; - iIndex++, tOffset += 4) { - aulTextOffset[iIndex] = ulGetLong(tOffset, aucBuffer); + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; + tIndex < tLen; + tIndex++, tOffset += 4) { + ulTextOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulTextOffset); + aulCharPos[tIndex] = ulBeginOfText + ulTextOffset; + NO_DBG_HEX(aulCharPos[tIndex]); } /* Save the Sepx offsets */ aulSectPage = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = (tLen + 1) * 4; - iIndex < (int)tLen; - iIndex++, tOffset += 6) { - aulSectPage[iIndex] = ulGetLong(tOffset + 2, aucBuffer); - NO_DBG_HEX(aulSectPage[iIndex]); /* fcSepx */ + for (tIndex = 0, tOffset = (tLen + 1) * 4; + tIndex < tLen; + tIndex++, tOffset += 6) { + aulSectPage[tIndex] = ulGetLong(tOffset + 2, aucBuffer); + NO_DBG_HEX(aulSectPage[tIndex]); /* fcSepx */ } aucBuffer = xfree(aucBuffer); /* Read the Section Properties */ - for (iIndex = 0; iIndex < (int)tLen; iIndex++) { - if (aulSectPage[iIndex] == FC_INVALID) { - vDefault2SectionInfoList(aulTextOffset[iIndex]); + for (tIndex = 0; tIndex < tLen; tIndex++) { + if (aulSectPage[tIndex] == FC_INVALID) { + vDefault2SectionInfoList(aulCharPos[tIndex]); continue; } /* Get the number of bytes to read */ - if (!bReadBytes(aucTmp, 1, aulSectPage[iIndex], pFile)) { + if (!bReadBytes(aucTmp, 1, aulSectPage[tIndex], pFile)) { continue; } tBytes = 1 + (size_t)ucGetByte(0, aucTmp); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:153,159 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:202,208 NO_DBG_DEC(tBytes); /* Read the bytes */ aucFpage = xmalloc(tBytes); - if (!bReadBytes(aucFpage, tBytes, aulSectPage[iIndex], pFile)) { + if (!bReadBytes(aucFpage, tBytes, aulSectPage[tIndex], pFile)) { aucFpage = xfree(aucFpage); continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:161,174 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:210,268 /* Process the bytes */ vGetDefaultSection(&tSection); vGet2SectionInfo(aucFpage + 1, tBytes - 1, &tSection); - vAdd2SectionInfoList(&tSection, aulTextOffset[iIndex]); + vAdd2SectionInfoList(&tSection, aulCharPos[tIndex]); aucFpage = xfree(aucFpage); } - aulTextOffset = xfree(aulTextOffset); + aulCharPos = xfree(aulCharPos); aulSectPage = xfree(aulSectPage); } /* end of vGet2SepInfo */ /* + * Build the list with Header/Footer Information for WinWord 1/2 files + */ + void + vGet2HdrFtrInfo(FILE *pFile, const UCHAR *aucHeader) + { + ULONG *aulCharPos; + UCHAR *aucBuffer; + ULONG ulHdrFtrOffset, ulBeginHdrFtrInfo; + size_t tHdrFtrInfoLen, tIndex, tOffset, tLen; + + fail(pFile == NULL || aucHeader == NULL); + + ulBeginHdrFtrInfo = ulGetLong(0x9a, aucHeader); /* fcPlcfhdd */ + NO_DBG_HEX(ulBeginHdrFtrInfo); + tHdrFtrInfoLen = (size_t)usGetWord(0x9e, aucHeader); /* cbPlcfhdd */ + NO_DBG_DEC(tHdrFtrInfoLen); + if (tHdrFtrInfoLen < 8) { + DBG_DEC_C(tHdrFtrInfoLen != 0, tHdrFtrInfoLen); + return; + } + + aucBuffer = xmalloc(tHdrFtrInfoLen); + if (!bReadBytes(aucBuffer, tHdrFtrInfoLen, ulBeginHdrFtrInfo, pFile)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tHdrFtrInfoLen); + + tLen = tHdrFtrInfoLen / 4 - 1; + /* Save the header/footer offsets */ + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; + tIndex < tLen; + tIndex++, tOffset += 4) { + ulHdrFtrOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulHdrFtrOffset); + aulCharPos[tIndex] = ulHdrFtrOffset2CharPos(ulHdrFtrOffset); + NO_DBG_HEX(aulCharPos[tIndex]); + } + vCreat2HdrFtrInfoList(aulCharPos, tLen); + aulCharPos = xfree(aulCharPos); + aucBuffer = xfree(aucBuffer); + } /* end of vGet2HdrFtrInfo */ + + /* * Translate the rowinfo to a member of the row_info enumeration */ row_info_enum /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:311,317 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:405,410 werr(1, "The number of columns is corrupt"); } pRow->ucNumberOfColumns = (UCHAR)iCol; - pRow->iColumnWidthSum = 0; iPosPrev = (int)(short)usGetWord( iFodo + iFodoOff + 4, aucGrpprl); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:321,328 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:414,419 aucGrpprl); pRow->asColumnWidth[iIndex] = (short)(iPosCurr - iPosPrev); - pRow->iColumnWidthSum += - pRow->asColumnWidth[iIndex]; iPosPrev = iPosCurr; } bFound154 = TRUE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:393,398 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:484,490 eGetNumType(ucTmp) == level_type_pause; break; case 15: /* ChgTabsPapx */ + case 23: /* ChgTabs */ iTmp = (int)ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); if (iTmp < 2) { iInfoLen = 1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:804,810 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:896,902 if (tBytes > sizeof(aucChpx)) { NO_DBG_PRINT_BLOCK(aucGrpprl + iFodo, tBytes); - return FALSE; + tBytes = sizeof(aucChpx); } /* Build the CHPX structure */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:812,818 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:904,910 (void)memcpy(aucChpx, aucGrpprl + iFodo, min(tBytes, sizeof(aucChpx))); ulTmp = ulGetLong(8, aucChpx); - if (ulTmp != 0) { + if (ulTmp != 0 && ulTmp < MAX_FILESIZE) { pPicture->ulPictureOffset = ulTmp; DBG_HEX(pPicture->ulPictureOffset); return TRUE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:835,841 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:927,933 if (tBytes > sizeof(aucChpx)) { NO_DBG_PRINT_BLOCK(aucGrpprl + iFodo, tBytes); - return FALSE; + tBytes = sizeof(aucChpx); } /* Build the CHPX structure */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:843,849 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:935,941 (void)memcpy(aucChpx, aucGrpprl + iFodo, min(tBytes, sizeof(aucChpx))); ulTmp = ulGetLong(14, aucChpx); - if (ulTmp != 0) { + if (ulTmp != 0 && ulTmp < MAX_FILESIZE) { pPicture->ulPictureOffset = ulTmp; DBG_HEX(pPicture->ulPictureOffset); DBG_DEC(tBytes); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop2.c:879,884 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop2.c:971,977 DBG_DEC(tCharInfoLen); if (tCharInfoLen < 4) { DBG_DEC(tCharInfoLen); + return; } aucBuffer = xmalloc(tCharInfoLen); [jmk] --rw-rw-r-- M 499692 jmk sys 28409 Jan 14 12:57 sys/src/cmd/aux/antiword/prop2.c [jmk] --rw-rw-r-- M 499692 jmk sys 30660 Jan 14 12:57 sys/src/cmd/aux/antiword/prop6.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:1,6 /* * prop6.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GPL * * Description: * Read the property information from a MS Word 6 or 7 file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:50,58 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:50,56 return 1 + 5; case 73: case 95: case 136: case 137: return 1 + 3; - case 120: - return 1 + 13; - case 187: + case 120: case 187: return 1 + 12; default: return 1 + 1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:60,65 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:58,106 } /* end of iGet6InfoLength */ /* + * Build the lists with Document Property Information for Word 6/7 files + */ + void + vGet6DopInfo(FILE *pFile, ULONG ulStartBlock, + const ULONG *aulBBD, size_t tBBDLen, + const UCHAR *aucHeader) + { + document_block_type tDocument; + UCHAR *aucBuffer; + ULONG ulBeginDocpInfo, ulTmp; + size_t tDocpInfoLen; + USHORT usTmp; + + ulBeginDocpInfo = ulGetLong(0x150, aucHeader); /* fcDop */ + DBG_HEX(ulBeginDocpInfo); + tDocpInfoLen = (size_t)ulGetLong(0x154, aucHeader); /* lcbDop */ + DBG_DEC(tDocpInfoLen); + if (tDocpInfoLen < 28) { + DBG_MSG("No Document information"); + return; + } + + aucBuffer = xmalloc(tDocpInfoLen); + if (!bReadBuffer(pFile, ulStartBlock, + aulBBD, tBBDLen, BIG_BLOCK_SIZE, + aucBuffer, ulBeginDocpInfo, tDocpInfoLen)) { + aucBuffer = xfree(aucBuffer); + return; + } + + usTmp = usGetWord(0x00, aucBuffer); + tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */ + tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */ + ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ + tDocument.tCreateDate = tConvertDTTM(ulTmp); + ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ + tDocument.tRevisedDate = tConvertDTTM(ulTmp); + vCreateDocumentInfoList(&tDocument); + + aucBuffer = xfree(aucBuffer); + } /* end of vGet6DopInfo */ + + /* * Fill the section information block with information * from a Word 6/7 file. */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:110,115 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:151,160 usCcol = 1 + usGetWord(iFodoOff + 1, aucGrpprl); DBG_DEC(usCcol); break; + case 153: /* grpfIhdt */ + pSection->ucHdrFtrSpecification = + ucGetByte(iFodoOff + 1, aucGrpprl); + break; default: break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:130,140 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:175,184 const UCHAR *aucHeader) { section_block_type tSection; - ULONG *aulSectPage, *aulTextOffset; + ULONG *aulSectPage, *aulCharPos; UCHAR *aucBuffer, *aucFpage; - ULONG ulBeginSectInfo; - size_t tSectInfoLen, tOffset, tLen, tBytes; - int iIndex; + ULONG ulBeginOfText, ulTextOffset, ulBeginSectInfo; + size_t tSectInfoLen, tIndex, tOffset, tLen, tBytes; UCHAR aucTmp[2]; fail(pFile == NULL || aucHeader == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:141,146 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:185,192 fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); fail(aulBBD == NULL); + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ + NO_DBG_HEX(ulBeginOfText); ulBeginSectInfo = ulGetLong(0x88, aucHeader); /* fcPlcfsed */ DBG_HEX(ulBeginSectInfo); tSectInfoLen = (size_t)ulGetLong(0x8c, aucHeader); /* lcbPlcfsed */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:162,193 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:208,240 /* Read the Section Descriptors */ tLen = (tSectInfoLen - 4) / 16; /* Save the section offsets */ - aulTextOffset = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = 0; - iIndex < (int)tLen; - iIndex++, tOffset += 4) { - aulTextOffset[iIndex] = ulGetLong(tOffset, aucBuffer); + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; tIndex < tLen; tIndex++, tOffset += 4) { + ulTextOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulTextOffset); + aulCharPos[tIndex] = ulBeginOfText + ulTextOffset; + NO_DBG_HEX(aulCharPos[tIndex]); } /* Save the Sepx offsets */ aulSectPage = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = (tLen + 1) * 4; - iIndex < (int)tLen; - iIndex++, tOffset += 12) { - aulSectPage[iIndex] = ulGetLong(tOffset + 2, aucBuffer); - NO_DBG_HEX(aulSectPage[iIndex]); /* fcSepx */ + for (tIndex = 0, tOffset = (tLen + 1) * 4; + tIndex < tLen; + tIndex++, tOffset += 12) { + aulSectPage[tIndex] = ulGetLong(tOffset + 2, aucBuffer); + NO_DBG_HEX(aulSectPage[tIndex]); /* fcSepx */ } aucBuffer = xfree(aucBuffer); /* Read the Section Properties */ - for (iIndex = 0; iIndex < (int)tLen; iIndex++) { - if (aulSectPage[iIndex] == FC_INVALID) { - vDefault2SectionInfoList(aulTextOffset[iIndex]); + for (tIndex = 0; tIndex < tLen; tIndex++) { + if (aulSectPage[tIndex] == FC_INVALID) { + vDefault2SectionInfoList(aulCharPos[tIndex]); continue; } /* Get the number of bytes to read */ if (!bReadBuffer(pFile, ulStartBlock, aulBBD, tBBDLen, BIG_BLOCK_SIZE, - aucTmp, aulSectPage[iIndex], 2)) { + aucTmp, aulSectPage[tIndex], 2)) { continue; } tBytes = 2 + (size_t)usGetWord(0, aucTmp); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:196,202 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:243,249 aucFpage = xmalloc(tBytes); if (!bReadBuffer(pFile, ulStartBlock, aulBBD, tBBDLen, BIG_BLOCK_SIZE, - aucFpage, aulSectPage[iIndex], tBytes)) { + aucFpage, aulSectPage[tIndex], tBytes)) { aucFpage = xfree(aucFpage); continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:204,217 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:251,315 /* Process the bytes */ vGetDefaultSection(&tSection); vGet6SectionInfo(aucFpage + 2, tBytes - 2, &tSection); - vAdd2SectionInfoList(&tSection, aulTextOffset[iIndex]); + vAdd2SectionInfoList(&tSection, aulCharPos[tIndex]); aucFpage = xfree(aucFpage); } - aulTextOffset = xfree(aulTextOffset); + aulCharPos = xfree(aulCharPos); aulSectPage = xfree(aulSectPage); } /* end of vGet6SepInfo */ /* + * Build the list with Header/Footer Information for Word 6/7 files + */ + void + vGet6HdrFtrInfo(FILE *pFile, ULONG ulStartBlock, + const ULONG *aulBBD, size_t tBBDLen, + const UCHAR *aucHeader) + { + ULONG *aulCharPos; + UCHAR *aucBuffer; + ULONG ulHdrFtrOffset, ulBeginHdrFtrInfo; + size_t tHdrFtrInfoLen, tIndex, tOffset, tLen; + + fail(pFile == NULL || aucHeader == NULL); + fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); + fail(aulBBD == NULL); + + ulBeginHdrFtrInfo = ulGetLong(0xb0, aucHeader); /* fcPlcfhdd */ + NO_DBG_HEX(ulBeginHdrFtrInfo); + tHdrFtrInfoLen = (size_t)ulGetLong(0xb4, aucHeader); /* lcbPlcfhdd */ + NO_DBG_DEC(tHdrFtrInfoLen); + if (tHdrFtrInfoLen < 8) { + DBG_DEC_C(tHdrFtrInfoLen != 0, tHdrFtrInfoLen); + return; + } + + aucBuffer = xmalloc(tHdrFtrInfoLen); + if (!bReadBuffer(pFile, ulStartBlock, + aulBBD, tBBDLen, BIG_BLOCK_SIZE, + aucBuffer, ulBeginHdrFtrInfo, tHdrFtrInfoLen)) { + aucBuffer = xfree(aucBuffer); + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tHdrFtrInfoLen); + + tLen = tHdrFtrInfoLen / 4 - 1; + /* Save the header/footer offsets */ + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; + tIndex < tLen; + tIndex++, tOffset += 4) { + ulHdrFtrOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulHdrFtrOffset); + aulCharPos[tIndex] = ulHdrFtrOffset2CharPos(ulHdrFtrOffset); + NO_DBG_HEX(aulCharPos[tIndex]); + } + vCreat6HdrFtrInfoList(aulCharPos, tLen); + aulCharPos = xfree(aulCharPos); + aucBuffer = xfree(aucBuffer); + } /* end of vGet6HdrFtrInfo */ + + /* * Translate the rowinfo to a member of the row_info enumeration */ row_info_enum /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:235,241 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:333,339 while (iBytes >= iFodoOff + 1) { iInfoLen = 0; switch (ucGetByte(iFodo + iFodoOff, aucGrpprl)) { - case 24: /* fIntable */ + case 24: /* fInTable */ if (odd(ucGetByte(iFodo + iFodoOff + 1, aucGrpprl))) { bFound24_1 = TRUE; } else { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:289,294 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:387,397 pRow->ucBorderInfo |= TABLE_BORDER_RIGHT; } break; + case 188: /* cDefTable10 */ + DBG_MSG("188: sprmTDefTable10"); + iSize = (int)usGetWord(iFodo + iFodoOff + 1, aucGrpprl); + DBG_DEC(iSize); + break; case 190: /* cDefTable */ iSize = (int)usGetWord(iFodo + iFodoOff + 1, aucGrpprl); if (iSize < 6 || iBytes < iFodoOff + 7) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:310,316 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:413,418 werr(1, "The number of columns is corrupt"); } pRow->ucNumberOfColumns = (UCHAR)iCol; - pRow->iColumnWidthSum = 0; iPosPrev = (int)(short)usGetWord( iFodo + iFodoOff + 4, aucGrpprl); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:320,327 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:422,427 aucGrpprl); pRow->asColumnWidth[iIndex] = (short)(iPosCurr - iPosPrev); - pRow->iColumnWidthSum += - pRow->asColumnWidth[iIndex]; iPosPrev = iPosCurr; } bFound190 = TRUE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:336,345 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:436,446 } iFodoOff += iInfoLen; } - if (bFound24_1 && bFound25_1 && bFound190) { + + if (bFound25_1 && bFound190) { return found_end_of_row; } - if (bFound24_0 && bFound25_0 && !bFound190) { + if (bFound25_0 && !bFound190) { return found_not_end_of_row; } if (bFound24_1) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:413,418 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:514,520 eGetNumType(ucTmp) == level_type_pause; break; case 15: /* ChgTabsPapx */ + case 23: /* ChgTabs */ iTmp = (int)ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); if (iTmp < 2) { iInfoLen = 1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:495,501 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:597,604 ULONG ulCharPos, ulCharPosFirst, ulCharPosLast; ULONG ulBeginParfInfo; size_t tParfInfoLen, tParfPageNum, tOffset, tSize, tLenOld, tLen; - int iIndex, iIndex2, iRun, iFodo, iLen; + size_t tIndex, tIndex2, tRun; + int iFodo, iLen; row_info_enum eRowInfo; USHORT usParfFirstPage, usCount, usIstd; UCHAR aucFpage[BIG_BLOCK_SIZE]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:524,534 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:627,637 tLen = (tParfInfoLen - 4) / 6; ausParfPage = xcalloc(tLen, sizeof(USHORT)); - for (iIndex = 0, tOffset = (tLen + 1) * 4; - iIndex < (int)tLen; - iIndex++, tOffset += 2) { - ausParfPage[iIndex] = usGetWord(tOffset, aucBuffer); - NO_DBG_DEC(ausParfPage[iIndex]); + for (tIndex = 0, tOffset = (tLen + 1) * 4; + tIndex < tLen; + tIndex++, tOffset += 2) { + ausParfPage[tIndex] = usGetWord(tOffset, aucBuffer); + NO_DBG_DEC(ausParfPage[tIndex]); } DBG_HEX(ulGetLong(0, aucBuffer)); aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:544,552 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:647,655 ausParfPage = xrealloc(ausParfPage, tSize); /* Add new values */ usCount = usParfFirstPage + 1; - for (iIndex = (int)tLenOld; iIndex < (int)tLen; iIndex++) { - ausParfPage[iIndex] = usCount; - NO_DBG_DEC(ausParfPage[iIndex]); + for (tIndex = tLenOld; tIndex < tLen; tIndex++) { + ausParfPage[tIndex] = usCount; + NO_DBG_DEC(ausParfPage[tIndex]); usCount++; } } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:553,572 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:656,675 (void)memset(&tRow, 0, sizeof(tRow)); ulCharPosFirst = CP_INVALID; - for (iIndex = 0; iIndex < (int)tLen; iIndex++) { + for (tIndex = 0; tIndex < tLen; tIndex++) { if (!bReadBuffer(pFile, ulStartBlock, aulBBD, tBBDLen, BIG_BLOCK_SIZE, aucFpage, - (ULONG)ausParfPage[iIndex] * BIG_BLOCK_SIZE, + (ULONG)ausParfPage[tIndex] * BIG_BLOCK_SIZE, BIG_BLOCK_SIZE)) { break; } - iRun = (int)ucGetByte(0x1ff, aucFpage); - NO_DBG_DEC(iRun); - for (iIndex2 = 0; iIndex2 < iRun; iIndex2++) { - NO_DBG_HEX(ulGetLong(iIndex2 * 4, aucFpage)); + tRun = (size_t)ucGetByte(0x1ff, aucFpage); + NO_DBG_DEC(tRun); + for (tIndex2 = 0; tIndex2 < tRun; tIndex2++) { + NO_DBG_HEX(ulGetLong(tIndex2 * 4, aucFpage)); iFodo = 2 * (int)ucGetByte( - (iRun + 1) * 4 + iIndex2 * 7, aucFpage); + (tRun + 1) * 4 + tIndex2 * 7, aucFpage); if (iFodo <= 0) { continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:576,584 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:679,688 usIstd = (USHORT)ucGetByte(iFodo + 1, aucFpage); vFillStyleFromStylesheet(usIstd, &tStyle); vGet6StyleInfo(iFodo, aucFpage + 3, iLen - 3, &tStyle); - ulCharPos = ulGetLong(iIndex2 * 4, aucFpage); + ulCharPos = ulGetLong(tIndex2 * 4, aucFpage); NO_DBG_HEX(ulCharPos); - tStyle.ulFileOffset = ulCharPos2FileOffset(ulCharPos); + tStyle.ulFileOffset = ulCharPos2FileOffsetX( + ulCharPos, &tStyle.eListID); vAdd2StyleInfoList(&tStyle); eRowInfo = eGet6RowInfo(iFodo, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:589,595 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:693,699 break; } ulCharPosFirst = ulGetLong( - iIndex2 * 4, aucFpage); + tIndex2 * 4, aucFpage); NO_DBG_HEX(ulCharPosFirst); tRow.ulCharPosStart = ulCharPosFirst; tRow.ulFileOffsetStart = /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:599,609 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:703,713 break; case found_end_of_row: ulCharPosLast = ulGetLong( - iIndex2 * 4, aucFpage); + tIndex2 * 4, aucFpage); NO_DBG_HEX(ulCharPosLast); tRow.ulCharPosEnd = ulCharPosLast; - tRow.ulFileOffsetEnd = ulCharPos2FileOffset( - ulCharPosLast); + tRow.ulFileOffsetEnd = + ulCharPos2FileOffset(ulCharPosLast); DBG_HEX_C(tRow.ulFileOffsetEnd == FC_INVALID, ulCharPosLast); vAdd2RowInfoList(&tRow); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:635,640 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:739,746 USHORT usTmp; UCHAR ucTmp; + TRACE_MSG("vGet6FontInfo"); + fail(iFodo < 0 || aucGrpprl == NULL || pFont == NULL); iFodoOff = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:651,657 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:757,763 case 80: /* cIstd */ usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl); NO_DBG_DEC(usTmp); - break; + break; case 82: /* cDefault */ pFont->usFontStyle &= FONT_HIDDEN; pFont->ucFontColor = FONT_COLOR_DEFAULT; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:785,790 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:891,898 if (usTmp <= (USHORT)UCHAR_MAX) { pFont->ucFontNumber = (UCHAR)usTmp; } else { + DBG_DEC(usTmp); + DBG_FIXME(); pFont->ucFontNumber = 0; } break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:803,811 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:911,921 break; case 95: /* cHps, cHpsPos */ ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); + DBG_DEC(ucTmp); if (ucTmp != 0) { pFont->usFontSize = (USHORT)ucTmp; } + ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); DBG_DEC(ucTmp); break; case 98: /* cIco */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:816,821 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:926,939 pFont->usFontSize = usGetWord(iFodo + iFodoOff + 1, aucGrpprl); break; + case 100: /* cHpsInc */ + DBG_MSG("100: sprmCHpsInc"); + ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); + DBG_DEC(ucTmp); + break; + case 103: /* cMajority */ + DBG_MSG("103: sprmCMajority"); + break; case 104: /* cIss */ ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); ucTmp &= 0x07; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:827,833 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:945,951 NO_DBG_MSG("Subscript"); } break; - case 106: /* cHps */ + case 106: /* cHpsInc1 */ usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl); lTmp = (long)pFont->usFontSize + (long)usTmp; if (lTmp < 8) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:838,843 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:956,969 pFont->usFontSize = (USHORT)lTmp; } break; + case 108: /* cMajority50 */ + DBG_MSG("108: sprmCMajority50"); + break; + case 109: /* cHpsMul */ + DBG_MSG("109: sprmCHpsMul"); + usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl); + DBG_DEC(usTmp); + break; default: break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:860,865 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:986,993 BOOL bFound; UCHAR ucTmp; + TRACE_MSG("vGet6PicInfo"); + fail(iFodo < 0 || aucGrpprl == NULL || pPicture == NULL); iFodoOff = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:871,877 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:999,1006 iFodo + iFodoOff + 2, aucGrpprl); bFound = TRUE; break; - case 71: /* dttm */ + #if 0 + case 71: /* fData */ ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); if (ucTmp == 0x01) { /* Not a picture, but a form field */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:879,884 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:1008,1014 } DBG_DEC_C(ucTmp != 0, ucTmp); break; + #endif case 75: /* fOle2 */ ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl); if (ucTmp == 0x01) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:910,916 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:1040,1047 UCHAR *aucBuffer; ULONG ulFileOffset, ulCharPos, ulBeginCharInfo; size_t tCharInfoLen, tOffset, tSize, tLenOld, tLen, tCharPageNum; - int iIndex, iIndex2, iRun, iFodo, iLen; + size_t tIndex, tIndex2, tRun; + int iFodo, iLen; USHORT usCharFirstPage, usCount, usIstd; UCHAR aucFpage[BIG_BLOCK_SIZE]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:937,947 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:1068,1078 tLen = (tCharInfoLen - 4) / 6; ausCharPage = xcalloc(tLen, sizeof(USHORT)); - for (iIndex = 0, tOffset = (tLen + 1) * 4; - iIndex < (int)tLen; - iIndex++, tOffset += 2) { - ausCharPage[iIndex] = usGetWord(tOffset, aucBuffer); - NO_DBG_DEC(ausCharPage[iIndex]); + for (tIndex = 0, tOffset = (tLen + 1) * 4; + tIndex < tLen; + tIndex++, tOffset += 2) { + ausCharPage[tIndex] = usGetWord(tOffset, aucBuffer); + NO_DBG_DEC(ausCharPage[tIndex]); } DBG_HEX(ulGetLong(0, aucBuffer)); aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop6.c:957,984 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop6.c:1088,1115 ausCharPage = xrealloc(ausCharPage, tSize); /* Add new values */ usCount = usCharFirstPage + 1; - for (iIndex = (int)tLenOld; iIndex < (int)tLen; iIndex++) { - ausCharPage[iIndex] = usCount; - NO_DBG_DEC(ausCharPage[iIndex]); + for (tIndex = tLenOld; tIndex < tLen; tIndex++) { + ausCharPage[tIndex] = usCount; + NO_DBG_DEC(ausCharPage[tIndex]); usCount++; } } - for (iIndex = 0; iIndex < (int)tLen; iIndex++) { + for (tIndex = 0; tIndex < tLen; tIndex++) { if (!bReadBuffer(pFile, ulStartBlock, aulBBD, tBBDLen, BIG_BLOCK_SIZE, aucFpage, - (ULONG)ausCharPage[iIndex] * BIG_BLOCK_SIZE, + (ULONG)ausCharPage[tIndex] * BIG_BLOCK_SIZE, BIG_BLOCK_SIZE)) { break; } - iRun = (int)ucGetByte(0x1ff, aucFpage); - NO_DBG_DEC(iRun); - for (iIndex2 = 0; iIndex2 < iRun; iIndex2++) { - ulCharPos = ulGetLong(iIndex2 * 4, aucFpage); + tRun = (size_t)ucGetByte(0x1ff, aucFpage); + NO_DBG_DEC(tRun); + for (tIndex2 = 0; tIndex2 < tRun; tIndex2++) { + ulCharPos = ulGetLong(tIndex2 * 4, aucFpage); ulFileOffset = ulCharPos2FileOffset(ulCharPos); iFodo = 2 * (int)ucGetByte( - (iRun + 1) * 4 + iIndex2, aucFpage); + (tRun + 1) * 4 + tIndex2, aucFpage); iLen = (int)ucGetByte(iFodo, aucFpage); [jmk] --rw-rw-r-- M 499692 jmk sys 30660 Jan 14 12:57 sys/src/cmd/aux/antiword/prop6.c [jmk] --rw-rw-r-- M 499692 jmk sys 40247 Jan 14 12:57 sys/src/cmd/aux/antiword/prop8.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1,13 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1,14 /* * prop8.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: - * Read the property information from a MS Word 8, 9 or 10 file + * Read the property information from a MS Word 8, 9,10 or 11 file * * Word 8 is better known as Word 97 or as Word 98 for Mac * Word 9 is better known as Word 2000 or as Word 2001 for Mac * Word 10 is better known as Word 2002 or as Word XP + * Word 11 is better known as Word 2003 */ #include /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:18,24 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:19,25 /* - * iGet8InfoLength - the length of the information for Word 8/9/10 files + * iGet8InfoLength - the length of the information for Word 8/9/10/11 files */ static int iGet8InfoLength(int iByteNbr, const UCHAR *aucGrpprl) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:54,61 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:55,155 } /* end of iGet8InfoLength */ /* + * aucFillInfoBuffer - fill the information buffer + * + * Returns the information buffer when successful, otherwise NULL + */ + static UCHAR * + aucFillInfoBuffer(FILE *pFile, const pps_type *pTable, + const ULONG *aulBBD, size_t tBBDLen, + const ULONG *aulSBD, size_t tSBDLen, + ULONG ulBeginInfo, size_t tInfoLen) + { + const ULONG *aulBlockDepot; + UCHAR *aucBuffer; + size_t tBlockDepotLen, tBlockSize; + + fail(pFile == NULL || pTable == NULL); + fail(aulBBD == NULL || aulSBD == NULL); + fail(tInfoLen == 0); + + NO_DBG_DEC(pTable->ulSB); + NO_DBG_HEX(pTable->ulSize); + if (pTable->ulSize == 0) { + DBG_MSG("No information"); + return NULL; + } + + if (pTable->ulSize < MIN_SIZE_FOR_BBD_USE) { + /* Use the Small Block Depot */ + aulBlockDepot = aulSBD; + tBlockDepotLen = tSBDLen; + tBlockSize = SMALL_BLOCK_SIZE; + } else { + /* Use the Big Block Depot */ + aulBlockDepot = aulBBD; + tBlockDepotLen = tBBDLen; + tBlockSize = BIG_BLOCK_SIZE; + } + aucBuffer = xmalloc(tInfoLen); + if (!bReadBuffer(pFile, pTable->ulSB, + aulBlockDepot, tBlockDepotLen, tBlockSize, + aucBuffer, ulBeginInfo, tInfoLen)) { + aucBuffer = xfree(aucBuffer); + return NULL; + } + return aucBuffer; + } /* end of aucFillInfoBuffer */ + + /* + * Build the lists with Document Property Information for Word 8/9/10/11 files + */ + void + vGet8DopInfo(FILE *pFile, const pps_type *pTable, + const ULONG *aulBBD, size_t tBBDLen, + const ULONG *aulSBD, size_t tSBDLen, + const UCHAR *aucHeader) + { + document_block_type tDocument; + UCHAR *aucBuffer; + ULONG ulBeginDocpInfo, ulTmp; + size_t tDocpInfoLen; + USHORT usTmp; + + fail(pFile == NULL || pTable == NULL || aucHeader == NULL); + fail(aulBBD == NULL || aulSBD == NULL); + + ulBeginDocpInfo = ulGetLong(0x192, aucHeader); /* fcDop */ + NO_DBG_HEX(ulBeginSectInfo); + tDocpInfoLen = (size_t)ulGetLong(0x196, aucHeader); /* lcbDop */ + NO_DBG_DEC(tSectInfoLen); + if (tDocpInfoLen < 28) { + DBG_MSG("No Document information"); + return; + } + + aucBuffer = aucFillInfoBuffer(pFile, pTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, + ulBeginDocpInfo, tDocpInfoLen); + if (aucBuffer == NULL) { + return; + } + + usTmp = usGetWord(0x00, aucBuffer); + tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */ + tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */ + ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ + tDocument.tCreateDate = tConvertDTTM(ulTmp); + ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ + tDocument.tRevisedDate = tConvertDTTM(ulTmp); + vCreateDocumentInfoList(&tDocument); + + aucBuffer = xfree(aucBuffer); + } /* end of vGet8DopInfo */ + + /* * Fill the section information block with information - * from a Word 8/9/10 file. + * from a Word 8/9/10/11 file. */ static void vGet8SectionInfo(const UCHAR *aucGrpprl, size_t tBytes, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:77,82 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:171,180 DBG_DEC(ucTmp); pSection->bNewPage = ucTmp != 0 && ucTmp != 1; break; + case 0x3014: /* grpfIhdt */ + pSection->ucHdrFtrSpecification = + ucGetByte(iFodoOff + 2, aucGrpprl); + break; case 0x500b: /* ccolM1 */ usCcol = 1 + usGetWord(iFodoOff + 2, aucGrpprl); DBG_DEC(usCcol); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:116,122 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:214,220 } /* end of vGet8SectionInfo */ /* - * Build the lists with Section Property Information for Word 8/9/10 files + * Build the lists with Section Property Information for Word 8/9/10/11 files */ void vGet8SepInfo(FILE *pFile, const pps_info_type *pPPS, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:125,144 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:223,239 const UCHAR *aucHeader) { section_block_type tSection; - ULONG *aulSectPage, *aulTextOffset; - const ULONG *aulBlockDepot; + ULONG *aulSectPage, *aulCharPos; UCHAR *aucBuffer, *aucFpage; - ULONG ulBeginSectInfo; - ULONG ulTableSize, ulTableStartBlock; - size_t tSectInfoLen, tBlockDepotLen; - size_t tBlockSize, tOffset, tLen, tBytes; - int iIndex; - USHORT usDocStatus; + ULONG ulBeginOfText, ulTextOffset, ulBeginSectInfo; + size_t tSectInfoLen, tIndex, tOffset, tLen, tBytes; UCHAR aucTmp[2]; fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); fail(aulBBD == NULL || aulSBD == NULL); + ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */ + NO_DBG_HEX(ulBeginOfText); ulBeginSectInfo = ulGetLong(0xca, aucHeader); /* fcPlcfsed */ NO_DBG_HEX(ulBeginSectInfo); tSectInfoLen = (size_t)ulGetLong(0xce, aucHeader); /* lcbPlcfsed */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:148,217 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:243,288 return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_MSG("No section information"); + aucBuffer = aucFillInfoBuffer(pFile, &pPPS->tTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, + ulBeginSectInfo, tSectInfoLen); + if (aucBuffer == NULL) { return; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { - /* Use the Small Block Depot */ - aulBlockDepot = aulSBD; - tBlockDepotLen = tSBDLen; - tBlockSize = SMALL_BLOCK_SIZE; - } else { - /* Use the Big Block Depot */ - aulBlockDepot = aulBBD; - tBlockDepotLen = tBBDLen; - tBlockSize = BIG_BLOCK_SIZE; - } - aucBuffer = xmalloc(tSectInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, - aulBlockDepot, tBlockDepotLen, tBlockSize, - aucBuffer, ulBeginSectInfo, tSectInfoLen)) { - aucBuffer = xfree(aucBuffer); - return; - } NO_DBG_PRINT_BLOCK(aucBuffer, tSectInfoLen); /* Read the Section Descriptors */ tLen = (tSectInfoLen - 4) / 16; /* Save the section offsets */ - aulTextOffset = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = 0; - iIndex < (int)tLen; - iIndex++, tOffset += 4) { - aulTextOffset[iIndex] = ulGetLong(tOffset, aucBuffer); + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; + tIndex < tLen; + tIndex++, tOffset += 4) { + ulTextOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulTextOffset); + aulCharPos[tIndex] = ulBeginOfText + ulTextOffset; + NO_DBG_HEX(aulCharPos[tIndex]); } /* Save the Sepx offsets */ aulSectPage = xcalloc(tLen, sizeof(ULONG)); - for (iIndex = 0, tOffset = (tLen + 1) * 4; - iIndex < (int)tLen; - iIndex++, tOffset += 12) { - aulSectPage[iIndex] = ulGetLong(tOffset + 2, aucBuffer); - NO_DBG_HEX(aulSectPage[iIndex]); /* fcSepx */ + for (tIndex = 0, tOffset = (tLen + 1) * 4; + tIndex < tLen; + tIndex++, tOffset += 12) { + aulSectPage[tIndex] = ulGetLong(tOffset + 2, aucBuffer); + NO_DBG_HEX(aulSectPage[tIndex]); /* fcSepx */ } aucBuffer = xfree(aucBuffer); /* Read the Section Properties */ - for (iIndex = 0; iIndex < (int)tLen; iIndex++) { - if (aulSectPage[iIndex] == FC_INVALID) { - vDefault2SectionInfoList(aulTextOffset[iIndex]); + for (tIndex = 0; tIndex < tLen; tIndex++) { + if (aulSectPage[tIndex] == FC_INVALID) { + vDefault2SectionInfoList(aulCharPos[tIndex]); continue; } /* Get the number of bytes to read */ if (!bReadBuffer(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, BIG_BLOCK_SIZE, - aucTmp, aulSectPage[iIndex], 2)) { + aucTmp, aulSectPage[tIndex], 2)) { continue; } tBytes = 2 + (size_t)usGetWord(0, aucTmp); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:220,226 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:291,297 aucFpage = xmalloc(tBytes); if (!bReadBuffer(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, BIG_BLOCK_SIZE, - aucFpage, aulSectPage[iIndex], tBytes)) { + aucFpage, aulSectPage[tIndex], tBytes)) { aucFpage = xfree(aucFpage); continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:228,241 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:299,364 /* Process the bytes */ vGetDefaultSection(&tSection); vGet8SectionInfo(aucFpage + 2, tBytes - 2, &tSection); - vAdd2SectionInfoList(&tSection, aulTextOffset[iIndex]); + vAdd2SectionInfoList(&tSection, aulCharPos[tIndex]); aucFpage = xfree(aucFpage); } - aulTextOffset = xfree(aulTextOffset); + aulCharPos = xfree(aulCharPos); aulSectPage = xfree(aulSectPage); } /* end of vGet8SepInfo */ /* + * Build the list with Header/Footer Information for Word 8/9/10/11 files + */ + void + vGet8HdrFtrInfo(FILE *pFile, const pps_type *pTable, + const ULONG *aulBBD, size_t tBBDLen, + const ULONG *aulSBD, size_t tSBDLen, + const UCHAR *aucHeader) + { + ULONG *aulCharPos; + UCHAR *aucBuffer; + ULONG ulHdrFtrOffset, ulBeginHdrFtrInfo; + size_t tHdrFtrInfoLen, tIndex, tOffset, tLen; + + fail(pFile == NULL || pTable == NULL || aucHeader == NULL); + fail(aulBBD == NULL || aulSBD == NULL); + + ulBeginHdrFtrInfo = ulGetLong(0xf2, aucHeader); /* fcPlcfhdd */ + NO_DBG_HEX(ulBeginHdrFtrInfo); + tHdrFtrInfoLen = (size_t)ulGetLong(0xf6, aucHeader); /* lcbPlcfhdd */ + NO_DBG_DEC(tHdrFtrInfoLen); + if (tHdrFtrInfoLen < 8) { + DBG_DEC_C(tHdrFtrInfoLen != 0, tHdrFtrInfoLen); + return; + } + + aucBuffer = aucFillInfoBuffer(pFile, pTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, + ulBeginHdrFtrInfo, tHdrFtrInfoLen); + if (aucBuffer == NULL) { + return; + } + NO_DBG_PRINT_BLOCK(aucBuffer, tHdrFtrInfoLen); + + tLen = tHdrFtrInfoLen / 4 - 1; + DBG_DEC_C(tLen % 12 != 1 && tLen % 12 != 7, tLen); + /* Save the header/footer offsets */ + aulCharPos = xcalloc(tLen, sizeof(ULONG)); + for (tIndex = 0, tOffset = 0; + tIndex < tLen; + tIndex++, tOffset += 4) { + ulHdrFtrOffset = ulGetLong(tOffset, aucBuffer); + NO_DBG_HEX(ulHdrFtrOffset); + aulCharPos[tIndex] = ulHdrFtrOffset2CharPos(ulHdrFtrOffset); + NO_DBG_HEX(aulCharPos[tIndex]); + } + vCreat8HdrFtrInfoList(aulCharPos, tLen); + /* Clean up and leave */ + aulCharPos = xfree(aulCharPos); + aucBuffer = xfree(aucBuffer); + } /* end of vGet8HdrFtrInfo */ + + /* * Translate the rowinfo to a member of the row_info enumeration */ row_info_enum /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:247,252 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:370,376 int iPosCurr, iPosPrev; USHORT usTmp; BOOL bFound2416_0, bFound2416_1, bFound2417_0, bFound2417_1; + BOOL bFound244b_0, bFound244b_1, bFound244c_0, bFound244c_1; BOOL bFoundd608; fail(iFodo < 0 || aucGrpprl == NULL || pRow == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:256,266 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:380,394 bFound2416_1 = FALSE; bFound2417_0 = FALSE; bFound2417_1 = FALSE; + bFound244b_0 = FALSE; + bFound244b_1 = FALSE; + bFound244c_0 = FALSE; + bFound244c_1 = FALSE; bFoundd608 = FALSE; while (iBytes >= iFodoOff + 2) { iInfoLen = 0; switch (usGetWord(iFodo + iFodoOff, aucGrpprl)) { - case 0x2416: /* fIntable */ + case 0x2416: /* fInTable */ if (odd(ucGetByte(iFodo + iFodoOff + 2, aucGrpprl))) { bFound2416_1 = TRUE; } else { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:274,279 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:402,421 bFound2417_0 = TRUE; } break; + case 0x244b: /* sub-table fInTable */ + if (odd(ucGetByte(iFodo + iFodoOff + 2, aucGrpprl))) { + bFound244b_1 = TRUE; + } else { + bFound244b_0 = TRUE; + } + break; + case 0x244c: /* sub-table fTtp */ + if (odd(ucGetByte(iFodo + iFodoOff + 2, aucGrpprl))) { + bFound244c_1 = TRUE; + } else { + bFound244c_0 = TRUE; + } + break; case 0x6424: /* brcTop */ usTmp = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); usTmp &= 0xff00; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:314,319 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:456,466 pRow->ucBorderInfo |= TABLE_BORDER_RIGHT; } break; + case 0xd606: /* cDefTable10 */ + DBG_MSG("0xd606: sprmTDefTable10"); + iSize = (int)usGetWord(iFodo + iFodoOff + 2, aucGrpprl); + DBG_DEC(iSize); + break; case 0xd608: /* cDefTable */ iSize = (int)usGetWord(iFodo + iFodoOff + 2, aucGrpprl); if (iSize < 6 || iBytes < iFodoOff + 8) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:335,341 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:482,487 werr(1, "The number of columns is corrupt"); } pRow->ucNumberOfColumns = (UCHAR)iCol; - pRow->iColumnWidthSum = 0; iPosPrev = (int)(short)usGetWord( iFodo + iFodoOff + 5, aucGrpprl); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:345,352 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:491,496 aucGrpprl); pRow->asColumnWidth[iIndex] = (short)(iPosCurr - iPosPrev); - pRow->iColumnWidthSum += - pRow->asColumnWidth[iIndex]; iPosPrev = iPosCurr; } bFoundd608 = TRUE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:361,376 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:505,521 } iFodoOff += iInfoLen; } - if (bFound2416_1 && bFound2417_1 && bFoundd608) { + + if (bFound2417_1 && bFoundd608) { return found_end_of_row; } - if (bFound2416_0 && bFound2417_0 && !bFoundd608) { + if (bFound2417_0 && !bFoundd608) { return found_not_end_of_row; } - if (bFound2416_1) { + if (bFound2416_1 || bFound244b_1) { return found_a_cell; } - if (bFound2416_0) { + if (bFound2416_0 || bFound244b_0) { return found_not_a_cell; } return found_nothing; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:378,384 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:523,529 /* * Fill the style information block with information - * from a Word 8/9/10 file. + * from a Word 8/9/10/11 file. */ void vGet8StyleInfo(int iFodo, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:432,450 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:577,596 DBG_DEC(sTmp); DBG_DEC(pStyle->sLeftIndent); break; - case 0x6c0d: /* ChgTabsPapx */ + case 0xc60d: /* ChgTabsPapx */ + case 0xc615: /* ChgTabs */ iTmp = (int)ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); if (iTmp < 2) { iInfoLen = 1; break; } - DBG_DEC(iTmp); + NO_DBG_DEC(iTmp); iDel = (int)ucGetByte(iFodo + iFodoOff + 3, aucGrpprl); if (iTmp < 2 + 2 * iDel) { iInfoLen = 1; break; } - DBG_DEC(iDel); + NO_DBG_DEC(iDel); iAdd = (int)ucGetByte( iFodo + iFodoOff + 4 + 2 * iDel, aucGrpprl); if (iTmp < 2 + 2 * iDel + 2 * iAdd) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:451,457 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:597,603 iInfoLen = 1; break; } - DBG_DEC(iAdd); + NO_DBG_DEC(iAdd); break; case 0x840e: /* dxaRight */ pStyle->sRightIndent = (short)usGetWord( /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:567,573 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:713,719 } /* end of sGetLeftIndent */ /* - * Build the list with List Information for Word 8/9/10 files + * Build the list with List Information for Word 8/9/10/11 files */ void vGet8LstInfo(FILE *pFile, const pps_info_type *pPPS, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:578,584 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:724,729 list_block_type tList; const ULONG *aulBlockDepot; UCHAR *aucLfoInfo, *aucLstfInfo, *aucPapx, *aucXString; - ULONG ulTableStartBlock, ulTableSize; ULONG ulBeginLfoInfo, ulBeginLstfInfo, ulBeginLvlfInfo; ULONG ulListID, ulStart; size_t tBlockDepotLen, tBlockSize; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:585,591 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:730,736 size_t tLfoInfoLen, tLstfInfoLen, tPapxLen, tXstLen, tOff; size_t tLstfRecords, tStart, tIndex; int iNums; - USHORT usDocStatus, usIstd; + USHORT usIstd; UCHAR ucTmp, ucListLevel, ucMaxLevel, ucChpxLen; UCHAR aucLvlfInfo[28], aucXst[2]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:592,613 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:737,750 fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); fail(aulBBD == NULL || aulSBD == NULL); - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { + NO_DBG_DEC(pPPS->tTable.ulSB); + NO_DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { DBG_MSG("No list information"); return; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:630,636 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:767,773 } aucLfoInfo = xmalloc(tLfoInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucLfoInfo, ulBeginLfoInfo, tLfoInfoLen)) { aucLfoInfo = xfree(aucLfoInfo); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:651,657 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:788,794 } aucLstfInfo = xmalloc(tLstfInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucLstfInfo, ulBeginLstfInfo, tLstfInfoLen)) { aucLstfInfo = xfree(aucLstfInfo); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:690,696 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:827,833 NO_DBG_HEX(ulStart); (void)memset(&tList, 0, sizeof(tList)); /* Read the lvlf (List leVeL on File) */ - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucLvlfInfo, ulStart, sizeof(aucLvlfInfo))) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:707,712 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:844,851 tList.ucNFC = ucGetByte(4, aucLvlfInfo); ucTmp = ucGetByte(5, aucLvlfInfo); tList.bNoRestart = (ucTmp & BIT(3)) != 0; + DBG_MSG_C((ucTmp & BIT(4)) != 0 && + (ucTmp & BIT(6)) != 0, "Found one"); } ulStart += sizeof(aucLvlfInfo); tPapxLen = (size_t)ucGetByte(25, aucLvlfInfo); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:713,719 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:852,858 if (tPapxLen != 0) { aucPapx = xmalloc(tPapxLen); /* Read the Papx */ - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucPapx, ulStart, tPapxLen)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:730,736 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:869,875 ucChpxLen = ucGetByte(24, aucLvlfInfo); ulStart += (ULONG)ucChpxLen; /* Read the length of the XString */ - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucXst, ulStart, sizeof(aucXst))) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:751,757 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:890,896 tXstLen *= 2; /* Length in chars to length in bytes */ aucXString = xmalloc(tXstLen); /* Read the XString */ - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucXString, ulStart, tXstLen)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:771,776 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:910,916 tOff *= 2; /* Offset in chars to offset in bytes */ NO_DBG_DEC(tOff); if (tList.ucNFC == LIST_SPECIAL || + tList.ucNFC == LIST_SPECIAL2 || tList.ucNFC == LIST_BULLETS) { tList.usListChar = usGetWord(0, aucXString); } else if (tOff != 0 && tOff < tXstLen) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:790,796 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:930,936 } /* end of vGet8LstInfo */ /* - * Build the lists with Paragraph Information for Word 8/9/10 files + * Build the lists with Paragraph Information for Word 8/9/10/11 files */ void vGet8PapInfo(FILE *pFile, const pps_info_type *pPPS, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:801,816 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:941,953 row_block_type tRow; style_block_type tStyle; ULONG *aulParfPage; - const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulCharPos, ulCharPosFirst, ulCharPosLast; ULONG ulBeginParfInfo; - ULONG ulTableSize, ulTableStartBlock; - size_t tParfInfoLen, tBlockDepotLen; - size_t tBlockSize, tOffset, tLen; + size_t tParfInfoLen, tOffset, tLen; int iIndex, iIndex2, iRun, iFodo, iLen; row_info_enum eRowInfo; - USHORT usDocStatus, usIstd; + USHORT usIstd; UCHAR aucFpage[BIG_BLOCK_SIZE]; fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:825,864 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:962,973 return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_MSG("No paragraph information"); + aucBuffer = aucFillInfoBuffer(pFile, &pPPS->tTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, + ulBeginParfInfo, tParfInfoLen); + if (aucBuffer == NULL) { return; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { - /* Use the Small Block Depot */ - aulBlockDepot = aulSBD; - tBlockDepotLen = tSBDLen; - tBlockSize = SMALL_BLOCK_SIZE; - } else { - /* Use the Big Block Depot */ - aulBlockDepot = aulBBD; - tBlockDepotLen = tBBDLen; - tBlockSize = BIG_BLOCK_SIZE; - } - - aucBuffer = xmalloc(tParfInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, - aulBlockDepot, tBlockDepotLen, tBlockSize, - aucBuffer, ulBeginParfInfo, tParfInfoLen)) { - aucBuffer = xfree(aucBuffer); - return; - } NO_DBG_PRINT_BLOCK(aucBuffer, tParfInfoLen); tLen = (tParfInfoLen / 4 - 1) / 2; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:906,912 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1015,1022 vGet8StyleInfo(iFodo, aucFpage + 3, iLen - 3, &tStyle); ulCharPos = ulGetLong(iIndex2 * 4, aucFpage); NO_DBG_HEX(ulCharPos); - tStyle.ulFileOffset = ulCharPos2FileOffset(ulCharPos); + tStyle.ulFileOffset = ulCharPos2FileOffsetX( + ulCharPos, &tStyle.eListID); vAdd2StyleInfoList(&tStyle); eRowInfo = eGet8RowInfo(iFodo, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:952,958 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1062,1068 /* * Fill the font information block with information - * from a Word 8/9/10 file. + * from a Word 8/9/10/11 file. */ void vGet8FontInfo(int iFodo, USHORT usIstd, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:960,970 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1070,1084 { long lTmp; int iFodoOff, iInfoLen; - USHORT usTmp; + USHORT usFtc0, usFtc1, usFtc2, usTmp; UCHAR ucTmp; fail(iFodo < 0 || aucGrpprl == NULL || pFont == NULL); + usFtc0 = USHRT_MAX; + usFtc1 = USHRT_MAX; + usFtc2 = USHRT_MAX; + iFodoOff = 0; while (iBytes >= iFodoOff + 2) { switch (usGetWord(iFodo + iFodoOff, aucGrpprl)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1122,1127 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1236,1246 ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); NO_DBG_DEC(pFont->ucFontColor); break; + case 0x2a44: /* cHpsInc */ + DBG_MSG("0x2a44: sprmCHpsInc"); + ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); + DBG_DEC(ucTmp); + break; case 0x2a48: /* cIss */ ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); ucTmp &= 0x07; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1142,1156 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1261,1284 usGetWord(iFodo + iFodoOff + 2, aucGrpprl); NO_DBG_DEC(pFont->usFontSize); break; - case 0x4a51: /* cFtc */ + case 0x4a4d: /* cHpsMul */ + DBG_MSG("0x4a4d: sprmCHpsMul"); usTmp = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); - if (usTmp <= (USHORT)UCHAR_MAX) { - pFont->ucFontNumber = (UCHAR)usTmp; - } else { - pFont->ucFontNumber = 0; - } + DBG_DEC(usTmp); break; - case 0xca4a: /* cHps */ + case 0x4a4f: /* cFtc0 */ + usFtc0 = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); + break; + case 0x4a50: /* cFtc1 */ + usFtc1 = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); + break; + case 0x4a51: /* cFtc2 */ + usFtc2 = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); + break; + case 0xca47: /* cMajority */ + DBG_MSG("0xca47: sprmCMajority"); + break; + case 0xca4a: /* cHpsInc1 */ usTmp = usGetWord(iFodo + iFodoOff + 2, aucGrpprl); lTmp = (long)pFont->usFontSize + (long)usTmp; if (lTmp < 8) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1161,1171 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1289,1304 pFont->usFontSize = (USHORT)lTmp; } break; + case 0xca4c: /* cMajority50 */ + DBG_MSG("0xca4c: sprmCMajority50"); + break; case 0xea3f: /* cHps, cHpsPos */ ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); + DBG_DEC(ucTmp); if (ucTmp != 0) { pFont->usFontSize = (USHORT)ucTmp; } + ucTmp = ucGetByte(iFodo + iFodoOff + 3, aucGrpprl); DBG_DEC(ucTmp); break; default: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1175,1185 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1308,1348 fail(iInfoLen <= 0); iFodoOff += iInfoLen; } + + /* Combine the Ftc's to a FontNumber */ + NO_DBG_DEC_C(usFtc0 != USHRT_MAX, usFtc0); + NO_DBG_DEC_C(usFtc2 != USHRT_MAX, usFtc2); + NO_DBG_DEC_C(usFtc1 != USHRT_MAX, usFtc1); + if (usFtc0 <= 0x7fff) { + if (usFtc0 <= (USHORT)UCHAR_MAX) { + pFont->ucFontNumber = (UCHAR)usFtc0; + } else { + DBG_DEC(usFtc0); + DBG_FIXME(); + pFont->ucFontNumber = 0; + } + } else if (usFtc2 <= 0x7fff) { + if (usFtc2 <= (USHORT)UCHAR_MAX) { + pFont->ucFontNumber = (UCHAR)usFtc2; + } else { + DBG_DEC(usFtc2); + DBG_FIXME(); + pFont->ucFontNumber = 0; + } + } else if (usFtc1 <= 0x7fff) { + if (usFtc1 <= (USHORT)UCHAR_MAX) { + pFont->ucFontNumber = (UCHAR)usFtc1; + } else { + DBG_DEC(usFtc1); + DBG_FIXME(); + pFont->ucFontNumber = 0; + } + } } /* end of vGet8FontInfo */ /* * Fill the picture information block with information - * from a Word 8/9/10 file. + * from a Word 8/9/10/11 file. * Returns TRUE when successful, otherwise FALSE */ static BOOL /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1186,1191 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1349,1355 bGet8PicInfo(int iFodo, const UCHAR *aucGrpprl, int iBytes, picture_block_type *pPicture) { + ULONG ulTmp; int iFodoOff, iInfoLen; BOOL bFound; UCHAR ucTmp; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1196,1201 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1360,1366 bFound = FALSE; while (iBytes >= iFodoOff + 2) { switch (usGetWord(iFodo + iFodoOff, aucGrpprl)) { + #if 0 case 0x0806: /* fData */ ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); if (ucTmp == 0x01) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1204,1209 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1369,1375 } DBG_DEC_C(ucTmp != 0, ucTmp); break; + #endif case 0x080a: /* fOle2 */ ucTmp = ucGetByte(iFodo + iFodoOff + 2, aucGrpprl); if (ucTmp == 0x01) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1212,1217 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1378,1387 } DBG_DEC_C(ucTmp != 0, ucTmp); break; + case 0x680e: /* fcObj */ + ulTmp = ulGetLong(iFodo + iFodoOff + 2, aucGrpprl); + DBG_HEX(ulTmp); + break; case 0x6a03: /* fcPic */ pPicture->ulPictureOffset = ulGetLong( iFodo + iFodoOff + 2, aucGrpprl); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1228,1234 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1398,1404 } /* end of bGet8PicInfo */ /* - * Build the lists with Character Information for Word 8/9/10 files + * Build the lists with Character Information for Word 8/9/10/11 files */ void vGet8ChrInfo(FILE *pFile, const pps_info_type *pPPS, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1239,1252 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1409,1419 font_block_type tFont; picture_block_type tPicture; ULONG *aulCharPage; - const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulFileOffset, ulCharPos, ulBeginCharInfo; - ULONG ulTableSize, ulTableStartBlock; - size_t tCharInfoLen, tBlockDepotLen; - size_t tOffset, tBlockSize, tLen; + size_t tCharInfoLen, tOffset, tLen; int iIndex, iIndex2, iRun, iFodo, iLen; - USHORT usDocStatus, usIstd; + USHORT usIstd; UCHAR aucFpage[BIG_BLOCK_SIZE]; fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/prop8.c:1261,1297 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/prop8.c:1428,1437 return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_MSG("No character information"); - return; - } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { - /* Use the Small Block Depot */ - aulBlockDepot = aulSBD; - tBlockDepotLen = tSBDLen; - tBlockSize = SMALL_BLOCK_SIZE; - } else { - /* Use the Big Block Depot */ - aulBlockDepot = aulBBD; - tBlockDepotLen = tBBDLen; - tBlockSize = BIG_BLOCK_SIZE; - } - aucBuffer = xmalloc(tCharInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, - aulBlockDepot, tBlockDepotLen, tBlockSize, - aucBuffer, ulBeginCharInfo, tCharInfoLen)) { - aucBuffer = xfree(aucBuffer); + aucBuffer = aucFillInfoBuffer(pFile, &pPPS->tTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, + ulBeginCharInfo, tCharInfoLen); + if (aucBuffer == NULL) { return; } NO_DBG_PRINT_BLOCK(aucBuffer, tCharInfoLen); [jmk] --rw-rw-r-- M 499692 jmk sys 40247 Jan 14 12:57 sys/src/cmd/aux/antiword/prop8.c [jmk] --rw-rw-r-- M 499692 jmk sys 5989 Jan 14 12:57 sys/src/cmd/aux/antiword/properties.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:1,6 /* * properties.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Read the properties information from a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:22,27 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:22,29 { options_type tOptions; + TRACE_MSG("vGetPropertyInfo"); + fail(pFile == NULL); fail(pPPS == NULL && iWordVersion >= 6); fail(aulBBD == NULL && tBBDLen != 0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:28,43 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:30,54 fail(aulSBD == NULL && tSBDLen != 0); fail(aucHeader == NULL); + /* Get the options */ vGetOptions(&tOptions); + /* Get the property information per Word version */ switch (iWordVersion) { case 0: + vGet0DopInfo(pFile, aucHeader); vGet0SepInfo(pFile, aucHeader); vGet0PapInfo(pFile, aucHeader); if (tOptions.eConversionType == conversion_draw || tOptions.eConversionType == conversion_ps || - tOptions.eConversionType == conversion_xml) { + tOptions.eConversionType == conversion_xml || + tOptions.eConversionType == conversion_fmt_text || + tOptions.eConversionType == conversion_pdf) { vGet0ChrInfo(pFile, aucHeader); + } + if (tOptions.eConversionType == conversion_draw || + tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { vCreate0FontTable(); } vSet0SummaryInfo(pFile, aucHeader); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:45,58 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:56,80 case 1: case 2: vGet2Stylesheet(pFile, iWordVersion, aucHeader); + vGet2DopInfo(pFile, aucHeader); vGet2SepInfo(pFile, aucHeader); vGet2PapInfo(pFile, aucHeader); + if (tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { + vGet2HdrFtrInfo(pFile, aucHeader); + } if (tOptions.eConversionType == conversion_draw || tOptions.eConversionType == conversion_ps || - tOptions.eConversionType == conversion_xml) { + tOptions.eConversionType == conversion_xml || + tOptions.eConversionType == conversion_fmt_text || + tOptions.eConversionType == conversion_pdf) { vGet2ChrInfo(pFile, iWordVersion, aucHeader); - vCreate2FontTable(pFile, aucHeader); } + if (tOptions.eConversionType == conversion_draw || + tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { + vCreate2FontTable(pFile, iWordVersion, aucHeader); + } vSet2SummaryInfo(pFile, iWordVersion, aucHeader); break; case 4: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:62,76 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:84,111 case 7: vGet6Stylesheet(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, aucHeader); + vGet6DopInfo(pFile, pPPS->tWordDocument.ulSB, + aulBBD, tBBDLen, aucHeader); vGet6SepInfo(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, aucHeader); vGet6PapInfo(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, aucHeader); + if (tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { + vGet6HdrFtrInfo(pFile, pPPS->tWordDocument.ulSB, + aulBBD, tBBDLen, aucHeader); + } if (tOptions.eConversionType == conversion_draw || tOptions.eConversionType == conversion_ps || - tOptions.eConversionType == conversion_xml) { + tOptions.eConversionType == conversion_xml || + tOptions.eConversionType == conversion_fmt_text || + tOptions.eConversionType == conversion_pdf) { vGet6ChrInfo(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, aucHeader); + } + if (tOptions.eConversionType == conversion_draw || + tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { vCreate6FontTable(pFile, pPPS->tWordDocument.ulSB, aulBBD, tBBDLen, aucHeader); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:82,96 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:117,144 aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); vGet8Stylesheet(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); + vGet8DopInfo(pFile, &pPPS->tTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); vGet8SepInfo(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); vGet8PapInfo(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); + if (tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { + vGet8HdrFtrInfo(pFile, &pPPS->tTable, + aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); + } if (tOptions.eConversionType == conversion_draw || tOptions.eConversionType == conversion_ps || - tOptions.eConversionType == conversion_xml) { + tOptions.eConversionType == conversion_xml || + tOptions.eConversionType == conversion_fmt_text || + tOptions.eConversionType == conversion_pdf) { vGet8ChrInfo(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); + } + if (tOptions.eConversionType == conversion_draw || + tOptions.eConversionType == conversion_ps || + tOptions.eConversionType == conversion_pdf) { vCreate8FontTable(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:103,108 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:151,159 werr(0, "Sorry, no property information"); break; } + + /* Temporarily: Correct the font table */ + vCorrectFontTable(tOptions.eConversionType, tOptions.eEncoding); } /* end of vGetPropertyInfo */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/properties.c:116,121 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/properties.c:167,174 row_block_type tRow; const UCHAR *aucPropMod; int iLen; + + TRACE_MSG("ePropMod2RowInfo"); aucPropMod = aucReadPropModListItem(usPropMod); if (aucPropMod == NULL) { [jmk] --rw-rw-r-- M 499692 jmk sys 5989 Jan 14 12:57 sys/src/cmd/aux/antiword/properties.c [jmk] --rw-rw-r-- M 499692 jmk sys 2427 Jan 14 12:57 sys/src/cmd/aux/antiword/propmod.c [jmk] --rw-rw-r-- M 499692 jmk sys 2427 Jan 14 12:57 sys/src/cmd/aux/antiword/propmod.c [jmk] --rw-rw-r-- M 499692 jmk sys 5517 Jan 14 12:57 sys/src/cmd/aux/antiword/riscos.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:7,14 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:7,16 */ #include - #include "kernel.h" - #include "swis.h" + #include + #include + #include "DeskLib:Error.h" + #include "DeskLib:SWI.h" #include "antiword.h" #if !defined(DrawFile_Render) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:18,24 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:20,46 #define JPEG_Info 0x049980 #endif /* !JPEG_Info */ + /* + * werr - write an error message and exit if needed + */ + void + werr(int iFatal, const char *szFormat, ...) + { + va_list tArg; + va_start(tArg, szFormat); + Error_Report(iFatal, (char *)szFormat, tArg); + va_end(tArg); + switch (iFatal) { + case 0: /* The message is just a warning, so no exit */ + return; + case 1: /* Fatal error with a standard exit */ + exit(EXIT_FAILURE); + default: /* Fatal error with a non-standard exit */ + exit(iFatal); + } + } /* end of werr */ + /* * iGetFiletype * This function will get the filetype of the given file. /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:27,43 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:49,64 int iGetFiletype(const char *szFilename) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; + int iType; fail(szFilename == NULL || szFilename[0] == '\0'); - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 23; - regs.r[1] = (int)szFilename; - e = _kernel_swi(OS_File, ®s, ®s); + e = SWI(2, 7, SWI_OS_File | XOS_Bit, + 23, szFilename, + NULL, NULL, NULL, NULL, NULL, NULL, &iType); if (e == NULL) { - return regs.r[6]; + return iType; } werr(0, "Get Filetype error %d: %s", e->errnum, e->errmess); return -1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:51,58 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:72,78 void vSetFiletype(const char *szFilename, int iFiletype) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; fail(szFilename == NULL || szFilename[0] == '\0'); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:59,69 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:79,86 if (iFiletype < 0x000 || iFiletype > 0xfff) { return; } - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 18; - regs.r[1] = (int)szFilename; - regs.r[2] = iFiletype; - e = _kernel_swi(OS_File, ®s, ®s); + e = SWI(3, 0, SWI_OS_File | XOS_Bit, + 18, szFilename, iFiletype); if (e != NULL) { switch (e->errnum) { case 0x000113: /* ROM */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:88,96 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:105,113 BOOL bMakeDirectory(const char *szFilename) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; char *pcLastDot; + int iObjectType; char szDirectory[PATH_MAX+1]; DBG_MSG("bMakeDirectory"); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:111,140 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:128,153 *pcLastDot = '\0'; DBG_MSG(szDirectory); /* Check if the name exists */ - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 17; - regs.r[1] = (int)szDirectory; - e = _kernel_swi(OS_File, ®s, ®s); + e = SWI(2, 1, SWI_OS_File | XOS_Bit, + 17, szDirectory, + &iObjectType); if (e != NULL) { werr(0, "Directory check %d: %s", e->errnum, e->errmess); return FALSE; } - if (regs.r[0] == 2) { + if (iObjectType == 2) { /* The name exists and it is a directory */ DBG_MSG("The directory already exists"); return TRUE; } - if (regs.r[0] != 0) { + if (iObjectType != 0) { /* The name exists and it is not a directory */ - DBG_DEC(regs.r[0]); + DBG_DEC(iObjectType); return FALSE; } /* The name does not exist, make the directory */ - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 8; - regs.r[1] = (int)szDirectory; - regs.r[4] = 0; - e = _kernel_swi(OS_File, ®s, ®s); + e = SWI(5, 0, SWI_OS_File | XOS_Bit, + 8, szDirectory, 0, 0, 0); if (e != NULL) { werr(0, "I can't make a directory %d: %s", e->errnum, e->errmess); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:151,165 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:164,177 int iReadCurrentAlphabetNumber(void) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; + int iAlphabetNumber; - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 71; - regs.r[1] = 127; - e = _kernel_swi(OS_Byte, ®s, ®s); + e = SWI(2, 2, SWI_OS_Byte | XOS_Bit, + 71, 127, + NULL, &iAlphabetNumber); if (e == NULL) { - return regs.r[1]; + return iAlphabetNumber; } werr(0, "Read alphabet error %d: %s", e->errnum, e->errmess); return -1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:173,192 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:185,202 int iGetRiscOsVersion(void) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; + int iVersion; - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 129; - regs.r[1] = 0; - regs.r[2] = 0xff; - e = _kernel_swi(OS_Byte, ®s, ®s); + e = SWI(3, 2, SWI_OS_Byte | XOS_Bit, + 129, 0, 0xff, + NULL, &iVersion); if (e != NULL) { werr(0, "Read RISC OS version error %d: %s", e->errnum, e->errmess); return 0; } - switch (regs.r[1]) { + switch (iVersion) { case 0xa0: /* Arthur 1.20 */ return 120; case 0xa1: /* RISC OS 2.00 */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:206,212 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:216,222 case 0xa8: /* RISC OS 4.0x */ return 400; default: - if (regs.r[1] >= 0xa9 && regs.r[1] <= 0xaf) { + if (iVersion >= 0xa9 && iVersion <= 0xaf) { /* RISC OS 4.10 and up */ return 410; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/riscos.c:215,287 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/riscos.c:225,248 } } /* end of iGetRiscOsVersion */ - /* - * Replaces the draw_render_diag function from RISC_OSLib when using - * RISC OS version 3.60 or higher - * This function calls a SWI that does not exist in earlier versions - */ - BOOL - bDrawRenderDiag360(draw_diag *pInfo, - draw_redrawstr *pRedraw, double dScale, draw_error *pError) - { - _kernel_swi_regs regs; - _kernel_oserror *e; - int aiTransform[6]; - - fail(pInfo == NULL); - fail(pRedraw == NULL); - fail(dScale < 0.01); - fail(pError == NULL); - fail(iGetRiscOsVersion() < 360); - - aiTransform[0] = (int)(dScale * 0x10000); - aiTransform[1] = 0; - aiTransform[2] = 0; - aiTransform[3] = (int)(dScale * 0x10000); - aiTransform[4] = (pRedraw->box.x0 - pRedraw->scx) * 256; - aiTransform[5] = (pRedraw->box.y1 - pRedraw->scy) * 256; - - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 0; - regs.r[1] = (int)pInfo->data; - regs.r[2] = pInfo->length; - regs.r[3] = (int)aiTransform; - regs.r[4] = (int)&pRedraw->box; - regs.r[5] = 0; - e = _kernel_swi(DrawFile_Render, ®s, ®s); - if (e == NULL) { - return TRUE; - } - werr(0, "DrawFile render error %d: %s", e->errnum, e->errmess); - pError->type = DrawOSError; - pError->err.os.errnum = e->errnum; - strncpy(pError->err.os.errmess, - e->errmess, - sizeof(pError->err.os.errmess) - 1); - pError->err.os.errmess[sizeof(pError->err.os.errmess) - 1] = '\0'; - return FALSE; - } /* end of bDrawRenderDiag360 */ - #if defined(DEBUG) BOOL bGetJpegInfo(UCHAR *pucJpeg, size_t tJpegSize) { - _kernel_swi_regs regs; - _kernel_oserror *e; + os_error *e; + int iReg0, iReg4, iReg5; - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 0x00; - regs.r[1] = (int)pucJpeg; - regs.r[2] = (int)tJpegSize; - e = _kernel_swi(JPEG_Info, ®s, ®s); + e = SWI(3, 6, JPEG_Info | XOS_Bit, + 0x00, pucJpeg, tJpegSize, + &iReg0, NULL, NULL, NULL, &iReg4, &iReg5); if (e == NULL) { - if (regs.r[0] & BIT(2)) { + if (iReg0 & BIT(2)) { DBG_MSG("Pixel density is a simple ratio"); } else { DBG_MSG("Pixel density is in dpi"); } - DBG_DEC(regs.r[4]); - DBG_DEC(regs.r[5]); + DBG_DEC(iReg4); + DBG_DEC(iReg5); return TRUE; } werr(0, "JPEG Info error %d: %s", e->errnum, e->errmess); [jmk] --rw-rw-r-- M 499692 jmk sys 5517 Jan 14 12:57 sys/src/cmd/aux/antiword/riscos.c [jmk] --rw-rw-r-- M 499692 jmk sys 2801 Jan 14 12:57 sys/src/cmd/aux/antiword/rowlist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/rowlist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/rowlist.c:1,6 /* * rowlist.c - * Copyright (C) 1998-2001 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GPL * * Description: * Build, read and destroy a list of Word table-row information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/rowlist.c:74,80 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/rowlist.c:74,79 NO_DBG_HEX(pRowBlock->ulFileOffsetStart); NO_DBG_HEX(pRowBlock->ulFileOffsetEnd); NO_DBG_DEC(pRowBlock->ucNumberOfColumns); - NO_DBG_DEC(pRowBlock->iColumnWidthSum); /* Create the new list member */ pListMember = xmalloc(sizeof(row_desc_type)); [jmk] --rw-rw-r-- M 499692 jmk sys 2801 Jan 14 12:57 sys/src/cmd/aux/antiword/rowlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 9851 Jan 14 12:57 sys/src/cmd/aux/antiword/saveas.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:8,17 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:8,49 #include #include - #include "saveas.h" - #include "event.h" + #include "DeskLib:Menu.h" + #include "DeskLib:Save.h" + #include "DeskLib:Template.h" + #include "DeskLib:Window.h" + #include "drawfile.h" #include "antiword.h" + /* The window handle of the save window */ + static window_handle tSaveWindow = 0; + + /* Xfer_send box fields */ + #define DRAG_SPRITE 3 + #define OK_BUTTON 0 + #define CANCEL_BUTTON (-1) + #define FILENAME_ICON 2 + + + /* + * saveas - a wrapper around Save_InitSaveWindowhandler + */ + static void + saveas(int iFileType, char *szOutfile, size_t tEstSize, + save_filesaver save_function, void *pvReference) + { + TRACE_MSG("saveas"); + + if (tSaveWindow == 0) { + tSaveWindow = Window_Create("xfer_send", template_TITLEMIN); + } + Icon_SetText(tSaveWindow, FILENAME_ICON, szOutfile); + Window_Show(tSaveWindow, open_UNDERPOINTER); + (void)Save_InitSaveWindowHandler(tSaveWindow, FALSE, TRUE, TRUE, + DRAG_SPRITE, OK_BUTTON, CANCEL_BUTTON, FILENAME_ICON, + save_function, NULL, NULL, tEstSize, iFileType, pvReference); + } /* end of saveas */ + static BOOL bWrite2File(void *pvBytes, size_t tSize, FILE *pFile, const char *szFilename) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:30,44 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:62,78 { FILE *pFile; diagram_type *pDiag; - draw_textstrhdr tText; - char *pcTmp; - int iToGo, iSize, iX, iYtopPrev, iHeight, iLines; + drawfile_object *pObj; + drawfile_text *pText; + const char *pcTmp; + int iToGo, iX, iYtopPrev, iHeight, iLines; BOOL bFirst, bIndent, bSuccess; + TRACE_MSG("bText2File"); + fail(szFilename == NULL || szFilename[0] == '\0'); fail(pvHandle == NULL); - DBG_MSG("bText2File"); DBG_MSG(szFilename); pDiag = (diagram_type *)pvHandle; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:51,72 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:85,105 iYtopPrev = 0; iHeight = (int)lWord2DrawUnits20(DEFAULT_FONT_SIZE); bSuccess = TRUE; - iToGo = pDiag->tInfo.length - sizeof(draw_fileheader); + fail(pDiag->tInfo.length < offsetof(drawfile_diagram, objects)); + iToGo = pDiag->tInfo.length - offsetof(drawfile_diagram, objects); DBG_DEC(iToGo); - pcTmp = pDiag->tInfo.data + sizeof(draw_fileheader); + pcTmp = (const char *)pDiag->tInfo.data + + offsetof(drawfile_diagram, objects); while (iToGo > 0 && bSuccess) { - tText = *(draw_textstrhdr *)pcTmp; - switch (tText.tag) { - case draw_OBJFONTLIST: - /* These are not relevant in a textfile */ - iSize = ((draw_fontliststrhdr *)pcTmp)->size; - pcTmp += iSize; - iToGo -= iSize; - break; - case draw_OBJTEXT: + pObj = (drawfile_object *)pcTmp; + switch (pObj->type) { + case drawfile_TYPE_TEXT: + pText = &pObj->data.text; /* Compute the number of lines */ - iLines = - (iYtopPrev - tText.bbox.y1 + iHeight / 2) / iHeight; + iLines = (iYtopPrev - pText->bbox.max.y + + iHeight / 2) / iHeight; + DBG_DEC_C(iLines < 0, iYtopPrev); + DBG_DEC_C(iLines < 0, pText->bbox.max.y); fail(iLines < 0); bIndent = iLines > 0 || bFirst; bFirst = FALSE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:78,86 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:111,119 } /* Print the indentation */ if (bIndent && bSuccess) { - for (iX = draw_screenToDraw(8); - iX <= tText.bbox.x0 && bSuccess; - iX += draw_screenToDraw(16)) { + for (iX = Drawfile_ScreenToDraw(8); + iX <= pText->bbox.min.x && bSuccess; + iX += Drawfile_ScreenToDraw(16)) { bSuccess = bWrite2File(" ", 1, pFile, szFilename); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:89,121 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:122,146 break; } /* Print the text object */ - pcTmp += sizeof(tText); - bSuccess = bWrite2File(pcTmp, - strlen(pcTmp), pFile, szFilename); - pcTmp += tText.size - sizeof(tText); - /* Setup for the next text object */ - iToGo -= tText.size; - iYtopPrev = tText.bbox.y1; - iHeight = tText.bbox.y1 - tText.bbox.y0; + bSuccess = bWrite2File(pText->text, + strlen(pText->text), pFile, szFilename); + /* Setup for the next object */ + iYtopPrev = pText->bbox.max.y; + iHeight = pText->bbox.max.y - pText->bbox.min.y; break; - case draw_OBJPATH: + case drawfile_TYPE_FONT_TABLE: + case drawfile_TYPE_PATH: + case drawfile_TYPE_SPRITE: + case drawfile_TYPE_JPEG: /* These are not relevant in a textfile */ - iSize = ((draw_pathstrhdr *)pcTmp)->size; - pcTmp += iSize; - iToGo -= iSize; break; - case draw_OBJSPRITE: - case draw_OBJJPEG: - /* These are not relevant in a textfile */ - iSize = ((draw_spristrhdr *)pcTmp)->size; - pcTmp += iSize; - iToGo -= iSize; - break; default: - DBG_DEC(tText.tag); + DBG_DEC(pObj->type); bSuccess = FALSE; break; } + pcTmp += pObj->size; + iToGo -= pObj->size; } DBG_DEC_C(iToGo != 0, iToGo); if (bSuccess) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:132,161 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:157,205 } /* end of bText2File */ /* - * vSaveTextfile + * bSaveTextfile - save the diagram as a text file */ - void - vSaveTextfile(diagram_type *pDiagram) + BOOL + bSaveTextfile(event_pollblock *pEvent, void *pvReference) { - wimp_emask tMask; - int iRecLen, iNbrRecs, iEstSize; + diagram_type *pDiag; + size_t tRecLen, tNbrRecs, tEstSize; - fail(pDiagram == NULL); + TRACE_MSG("bSaveTextfile"); - DBG_MSG("vSaveTextfile"); - iRecLen = sizeof(draw_textstrhdr) + DEFAULT_SCREEN_WIDTH * 2 / 3; - iNbrRecs = pDiagram->tInfo.length / iRecLen + 1; - iEstSize = iNbrRecs * DEFAULT_SCREEN_WIDTH * 2 / 3; - DBG_DEC(iEstSize); + fail(pEvent == NULL); + fail(pvReference == NULL); - tMask = event_getmask(); - event_setmask(0); - saveas(FILETYPE_TEXT, "WordText", - iEstSize, bText2File, - NULL, NULL, pDiagram); - event_setmask(tMask); - } /* end of vSaveTextfile */ + pDiag = (diagram_type *)pvReference; + switch (pEvent->type) { + case event_SEND: /* From a menu */ + fail(pEvent->data.message.header.action != message_MENUWARN); + if (menu_currentopen != pDiag->pSaveMenu || + pEvent->data.message.data.menuwarn.selection[0] != + SAVEMENU_SAVETEXT) { + return FALSE; + } + break; + case event_KEY: /* From a key short cut */ + if (pEvent->data.key.caret.window != pDiag->tMainWindow) { + return FALSE; + } + break; + default: + DBG_DEC(pEvent->type); + return FALSE; + } + + tRecLen = sizeof(drawfile_text) + DEFAULT_SCREEN_WIDTH * 2 / 3; + tNbrRecs = pDiag->tInfo.length / tRecLen + 1; + tEstSize = tNbrRecs * DEFAULT_SCREEN_WIDTH * 2 / 3; + DBG_DEC(tEstSize); + + saveas(FILETYPE_TEXT, "WordText", tEstSize, bText2File, pDiag); + return TRUE; + } /* end of bSaveTextfile */ + /* * bDraw2File - Save the generated draw file to a Draw file * /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:168,187 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:212,233 { FILE *pFile; diagram_type *pDiagram; - draw_fileheader tHdr; - draw_textstrhdr tText; - draw_pathstrhdr tPath; - draw_spristrhdr tSprite; - draw_jpegstrhdr tJpeg; + wimp_box *pBbox; + drawfile_object *pObj; + drawfile_text *pText; + drawfile_path *pPath; + drawfile_sprite *pSprite; + drawfile_jpeg *pJpeg; int *piPath; char *pcTmp; int iYadd, iToGo, iSize; BOOL bSuccess; + TRACE_MSG("bDraw2File"); + fail(szFilename == NULL || szFilename[0] == '\0'); fail(pvHandle == NULL); - DBG_MSG("bDraw2File"); NO_DBG_MSG(szFilename); pDiagram = (diagram_type *)pvHandle; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:193,243 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:239,293 iToGo = pDiagram->tInfo.length; DBG_DEC(iToGo); pcTmp = pDiagram->tInfo.data; - tHdr = *(draw_fileheader *)pcTmp; - iYadd = -tHdr.bbox.y0; - tHdr.bbox.y0 += iYadd; - tHdr.bbox.y1 += iYadd; - bSuccess = bWrite2File(&tHdr, sizeof(tHdr), pFile, szFilename); - iToGo -= sizeof(tHdr); - DBG_DEC(iToGo); - pcTmp += sizeof(tHdr); + bSuccess = bWrite2File(pcTmp, + offsetof(drawfile_diagram, bbox), pFile, szFilename); + if (bSuccess) { + pcTmp += offsetof(drawfile_diagram, bbox); + iToGo -= offsetof(drawfile_diagram, bbox); + pBbox = (wimp_box *)pcTmp; + iYadd = -pBbox->min.y; + pBbox->min.y += iYadd; + pBbox->max.y += iYadd; + bSuccess = bWrite2File(pcTmp, + sizeof(*pBbox), pFile, szFilename); + iToGo -= sizeof(*pBbox); + DBG_DEC(iToGo); + pcTmp += sizeof(*pBbox); + } else { + iYadd = 0; + } while (iToGo > 0 && bSuccess) { - tText = *(draw_textstrhdr *)pcTmp; - switch (tText.tag) { - case draw_OBJFONTLIST: - iSize = ((draw_fontliststrhdr *)pcTmp)->size; + pObj = (drawfile_object *)pcTmp; + iSize = pObj->size; + switch (pObj->type) { + case drawfile_TYPE_FONT_TABLE: bSuccess = bWrite2File(pcTmp, iSize, pFile, szFilename); pcTmp += iSize; iToGo -= iSize; break; - case draw_OBJTEXT: + case drawfile_TYPE_TEXT: + pText = &pObj->data.text; /* First correct the coordinates */ - tText.bbox.y0 += iYadd; - tText.bbox.y1 += iYadd; - tText.coord.y += iYadd; + pText->bbox.min.y += iYadd; + pText->bbox.max.y += iYadd; + pText->base.y += iYadd; /* Now write the information to file */ - bSuccess = bWrite2File(&tText, - sizeof(tText), pFile, szFilename); - pcTmp += sizeof(tText); - iSize = tText.size - sizeof(tText); - if (bSuccess) { - bSuccess = bWrite2File(pcTmp, + bSuccess = bWrite2File(pcTmp, iSize, pFile, szFilename); - pcTmp += iSize; - } - iToGo -= tText.size; + pcTmp += pObj->size; + iToGo -= pObj->size; break; - case draw_OBJPATH: - tPath = *(draw_pathstrhdr *)pcTmp; + case drawfile_TYPE_PATH: + pPath = &pObj->data.path; /* First correct the coordinates */ - tPath.bbox.y0 += iYadd; - tPath.bbox.y1 += iYadd; + pPath->bbox.min.y += iYadd; + pPath->bbox.max.y += iYadd; /* Now write the information to file */ - bSuccess = bWrite2File(&tPath, - sizeof(tPath), pFile, szFilename); - pcTmp += sizeof(tPath); - iSize = tPath.size - sizeof(tPath); + bSuccess = bWrite2File(pPath, + sizeof(*pPath), pFile, szFilename); + pcTmp += sizeof(*pPath); + iSize = pObj->size - sizeof(*pPath); fail(iSize < 14 * sizeof(int)); /* Second correct the path coordinates */ piPath = xmalloc(iSize); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:252,296 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:302,334 pcTmp += iSize; } piPath = xfree(piPath); - iToGo -= tPath.size; + iToGo -= pObj->size; break; - case draw_OBJSPRITE: - tSprite = *(draw_spristrhdr *)pcTmp; + case drawfile_TYPE_SPRITE: + pSprite = &pObj->data.sprite; /* First correct the coordinates */ - tSprite.bbox.y0 += iYadd; - tSprite.bbox.y1 += iYadd; + pSprite->bbox.min.y += iYadd; + pSprite->bbox.max.y += iYadd; /* Now write the information to file */ - bSuccess = bWrite2File(&tSprite, - sizeof(tSprite), pFile, szFilename); - pcTmp += sizeof(tSprite); - iSize = tSprite.size - sizeof(tSprite); - if (bSuccess) { - bSuccess = bWrite2File(pcTmp, + bSuccess = bWrite2File(pcTmp, iSize, pFile, szFilename); - pcTmp += iSize; - } - iToGo -= tSprite.size; + pcTmp += pObj->size; + iToGo -= pObj->size; break; - case draw_OBJJPEG: - tJpeg = *(draw_jpegstrhdr *)pcTmp; + case drawfile_TYPE_JPEG: + pJpeg = &pObj->data.jpeg; /* First correct the coordinates */ - tJpeg.bbox.y0 += iYadd; - tJpeg.bbox.y1 += iYadd; - tJpeg.trfm[5] += iYadd; + pJpeg->bbox.min.y += iYadd; + pJpeg->bbox.max.y += iYadd; + pJpeg->trfm.entries[2][1] += iYadd; /* Now write the information to file */ - bSuccess = bWrite2File(&tJpeg, - sizeof(tJpeg), pFile, szFilename); - pcTmp += sizeof(tJpeg); - iSize = tJpeg.size - sizeof(tJpeg); - if (bSuccess) { - bSuccess = bWrite2File(pcTmp, + bSuccess = bWrite2File(pcTmp, iSize, pFile, szFilename); - pcTmp += iSize; - } - iToGo -= tJpeg.size; + pcTmp += pObj->size; + iToGo -= pObj->size; break; default: - DBG_DEC(tText.tag); + DBG_DEC(pObj->type); bSuccess = FALSE; break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/saveas.c:307,330 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/saveas.c:345,387 } /* end of bDraw2File */ /* - * vSaveDrawfile + * bSaveDrawfile - save the diagram as a draw file */ - void - vSaveDrawfile(diagram_type *pDiagram) + BOOL + bSaveDrawfile(event_pollblock *pEvent, void *pvReference) { - wimp_emask tMask; - int iEstSize; + diagram_type *pDiag; + size_t tEstSize; - fail(pDiagram == NULL); + TRACE_MSG("bSaveDrawfile"); - DBG_MSG("vSaveDrawfile"); - iEstSize = pDiagram->tInfo.length; - DBG_DEC(iEstSize); + fail(pEvent == NULL); + fail(pvReference == NULL); - tMask = event_getmask(); - event_setmask(0); - saveas(FILETYPE_DRAW, "WordDraw", - iEstSize, bDraw2File, - NULL, NULL, pDiagram); - event_setmask(tMask); - } /* end of vSaveDrawfile */ + pDiag = (diagram_type *)pvReference; + + switch (pEvent->type) { + case event_SEND: /* From a menu */ + fail(pEvent->data.message.header.action != message_MENUWARN); + if (menu_currentopen != pDiag->pSaveMenu || + pEvent->data.message.data.menuwarn.selection[0] != + SAVEMENU_SAVEDRAW) { + return FALSE; + } + break; + case event_KEY: /* From a key short cut */ + if (pEvent->data.key.caret.window != pDiag->tMainWindow) { + return FALSE; + } + break; + default: + DBG_DEC(pEvent->type); + return FALSE; + } + + tEstSize = pDiag->tInfo.length; + DBG_DEC(tEstSize); + + saveas(FILETYPE_DRAW, "WordDraw", tEstSize, bDraw2File, pDiag); + return TRUE; + } /* end of bSaveDrawfile */ [jmk] --rw-rw-r-- M 499692 jmk sys 9851 Jan 14 12:57 sys/src/cmd/aux/antiword/saveas.c [jmk] --rw-rw-r-- M 499692 jmk sys 3785 Jan 14 12:57 sys/src/cmd/aux/antiword/sectlist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:1,6 /* * sectlist.c - * Copyright (C) 2001,2002 A.J. van Os; Released under GPL + * Copyright (C) 2001-2004 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy list(s) of Word section information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:17,23 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:17,23 */ typedef struct section_mem_tag { section_block_type tInfo; - ULONG ulTextOffset; + ULONG ulCharPos; struct section_mem_tag *pNext; } section_mem_type; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:52,58 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:52,58 * vAdd2SectionInfoList - Add an element to the Section Information List */ void - vAdd2SectionInfoList(const section_block_type *pSection, ULONG ulTextOffset) + vAdd2SectionInfoList(const section_block_type *pSection, ULONG ulCharPos) { section_mem_type *pListMember; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:62,68 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:62,68 pListMember = xmalloc(sizeof(section_mem_type)); /* Fill the list member */ pListMember->tInfo = *pSection; - pListMember->ulTextOffset = ulTextOffset; + pListMember->ulCharPos = ulCharPos; pListMember->pNext = NULL; /* Add the new member to the list */ if (pAnchor == NULL) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:88,99 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:88,99 * vDefault2SectionInfoList - Add a default to the Section Information List */ void - vDefault2SectionInfoList(ULONG ulTextOffset) + vDefault2SectionInfoList(ULONG ulCharPos) { section_block_type tSection; vGetDefaultSection(&tSection); - vAdd2SectionInfoList(&tSection, ulTextOffset); + vAdd2SectionInfoList(&tSection, ulCharPos); } /* end of vDefault2SectionInfoList */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:100,110 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:100,110 * pGetSectionInfo - get the section information */ const section_block_type * - pGetSectionInfo(const section_block_type *pOld, ULONG ulTextOffset) + pGetSectionInfo(const section_block_type *pOld, ULONG ulCharPos) { const section_mem_type *pCurr; - if (pOld == NULL || ulTextOffset == 0) { + if (pOld == NULL || ulCharPos == 0) { if (pAnchor == NULL) { /* There are no records, make one */ vDefault2SectionInfoList(0); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/sectlist.c:114,125 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/sectlist.c:114,165 NO_DBG_MSG("First record"); return &pAnchor->tInfo; } + + NO_DBG_HEX(ulCharPos); for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { - if (ulTextOffset == pCurr->ulTextOffset || - ulTextOffset + 1 == pCurr->ulTextOffset) { - NO_DBG_HEX(pCurr->ulTextOffset); + NO_DBG_HEX(pCurr->ulCharPos); + if (ulCharPos == pCurr->ulCharPos || + ulCharPos + 1 == pCurr->ulCharPos) { + NO_DBG_HEX(pCurr->ulCharPos); return &pCurr->tInfo; } } return pOld; } /* end of pGetSectionInfo */ + + /* + * tGetNumberOfSections - get the number of sections + */ + size_t + tGetNumberOfSections(void) + { + const section_mem_type *pCurr; + size_t tCounter; + + for (tCounter = 0, pCurr = pAnchor; + pCurr != NULL; + tCounter++, pCurr = pCurr->pNext) + ; /* Empty */ + return tCounter; + } /* end of tGetNumberOfSections */ + + /* + * ucGetSepHdrFtrSpecification - get the Heder/footer specification + */ + UCHAR + ucGetSepHdrFtrSpecification(size_t tSectionNumber) + { + const section_mem_type *pCurr; + size_t tIndex; + + for (tIndex = 0, pCurr = pAnchor; + tIndex < tSectionNumber && pCurr != NULL; + tIndex++, pCurr = pCurr->pNext) + ; /* Empty */ + if (pCurr == NULL) { + DBG_DEC(tSectionNumber); + DBG_FIXME(); + return 0x00; + } + return pCurr->tInfo.ucHdrFtrSpecification; + } /* end of ucGetSepHdrFtrSpecification */ [jmk] --rw-rw-r-- M 499692 jmk sys 3785 Jan 14 12:57 sys/src/cmd/aux/antiword/sectlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3416 Jan 14 12:57 sys/src/cmd/aux/antiword/startup.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:9,18 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:9,17 #include #include #include - #include "kernel.h" - #include "swis.h" - #include "wimp.h" - #include "wimpt.h" + #include "DeskLib:Error.h" + #include "DeskLib:Event.h" + #include "DeskLib:SWI.h" #include "antiword.h" /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:45,81 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:44,62 * * returns the task handle when found, otherwise 0 */ - static wimp_t - tGetTaskHandle(const char *szTaskname, int iOSVersion) + static task_handle + tGetTaskHandle(const char *szTaskname) { - _kernel_swi_regs regs; - _kernel_oserror *e; const char *pcTmp; - int iIndex; + int iReg0, iIndex; int aiBuffer[4]; char szTmp[21]; - if (iOSVersion < 310) { - /* - * SWI TaskManager_EnumerateTasks does not - * exist in earlier versions of RISC OS - */ - return 0; - } - - (void)memset((void *)®s, 0, sizeof(regs)); - regs.r[0] = 0; - + iReg0 = 0; do { /* Get info on the next task */ - regs.r[1] = (int)aiBuffer; - regs.r[2] = sizeof(aiBuffer); - e = _kernel_swi(TaskManager_EnumerateTasks, ®s, ®s); - if (e != NULL) { - werr(1, "TaskManager_EnumerateTasks error %d: %s", - e->errnum, e->errmess); - exit(EXIT_FAILURE); - } + Error_CheckFatal(SWI(3, 1, TaskManager_EnumerateTasks | XOS_Bit, + iReg0, aiBuffer, sizeof(aiBuffer), &iReg0)); /* Copy the (control character terminated) task name */ for (iIndex = 0, pcTmp = (const char *)aiBuffer[1]; iIndex < elementsof(szTmp); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:89,97 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:70,78 szTmp[elementsof(szTmp) - 1] = '\0'; if (bIsMatch(szTmp, szTaskname)) { /* Task found */ - return (wimp_t)aiBuffer[0]; + return (task_handle)aiBuffer[0]; } - } while (regs.r[0] >= 0); + } while (iReg0 >= 0); /* Task not found */ return 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:100,112 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:81,93 int main(int argc, char **argv) { - wimp_msgstr tMsg; - wimp_t tTaskHandle; + message_block tMsg; + task_handle tTaskHandle; size_t tArgLen; - int iVersion; + int aiMessages[] = {0}; char szCommand[512]; - iVersion = wimpt_init("StartUp"); + Event_Initialise3("StartUp", 310, aiMessages); if (argc > 1) { tArgLen = strlen(argv[1]); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:113,124 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:94,105 } else { tArgLen = 0; } - if (tArgLen >= sizeof(tMsg.data.dataload.name)) { + if (tArgLen >= sizeof(tMsg.data.dataload.filename)) { werr(1, "Input filename too long"); return EXIT_FAILURE; } - tTaskHandle = tGetTaskHandle("antiword", iVersion); + tTaskHandle = tGetTaskHandle("antiword"); if (tTaskHandle == 0) { /* Antiword is not active */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/startup.c:138,155 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/startup.c:119,141 /* Antiword is active */ if (argc > 1) { - /* Send the argument to Antiword */ - tMsg.hdr.size = ROUND4(sizeof(tMsg) - - sizeof(tMsg.data.dataload.name) + + /* + * Send the argument to Antiword by imitating a + * drag-and-drop to Antiword's iconbar icon + */ + memset(&tMsg, 0, sizeof(tMsg)); + tMsg.header.size = ROUND4(offsetof(message_block, data) + + offsetof(message_dataload, filename) + 1 + tArgLen); - tMsg.hdr.your_ref = 0; - tMsg.hdr.action = wimp_MDATALOAD; - tMsg.data.dataload.w = -1; + tMsg.header.yourref = 0; + tMsg.header.action = message_DATALOAD; + tMsg.data.dataload.window = window_ICONBAR; + tMsg.data.dataload.icon = -1; tMsg.data.dataload.size = 0; - tMsg.data.dataload.type = FILETYPE_MSWORD; - strcpy(tMsg.data.dataload.name, argv[1]); - wimpt_noerr(wimp_sendmessage(wimp_ESEND, - &tMsg, tTaskHandle)); + tMsg.data.dataload.filetype = FILETYPE_MSWORD; + strcpy(tMsg.data.dataload.filename, argv[1]); + Error_CheckFatal(Wimp_SendMessage(event_SEND, + &tMsg, tTaskHandle, 0)); return EXIT_SUCCESS; } else { /* Give an error message and return */ [jmk] --rw-rw-r-- M 499692 jmk sys 3416 Jan 14 12:57 sys/src/cmd/aux/antiword/startup.c [jmk] --rw-rw-r-- M 499692 jmk sys 12060 Jan 14 12:57 sys/src/cmd/aux/antiword/stylelist.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:1,6 /* * stylelist.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy a list of Word style information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:79,85 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:79,87 return; } - if (ucNFC != LIST_SPECIAL && ucNFC != LIST_BULLETS) { + if (ucNFC != LIST_SPECIAL && + ucNFC != LIST_SPECIAL2 && + ucNFC != LIST_BULLETS) { szListChar[0] = '.'; szListChar[1] = '\0'; return; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:94,100 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:96,102 switch (usListChar) { case 0x0000: case 0x00b7: case 0x00fe: case 0xf021: case 0xf043: - case 0xf093: case 0xf0b7: + case 0xf06c: case 0xf093: case 0xf0b7: usListChar = 0x2022; /* BULLET */ break; case 0x0096: case 0xf02d: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:130,136 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:132,138 case 0xf071: usListChar = 0x2751; /* LOWER RIGHT SHADOWED WHITE SQUARE */ break; - case 0xf075: + case 0xf075: case 0xf077: usListChar = 0x25c6; /* BLACK DIAMOND */ break; case 0xf076: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:156,171 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:158,178 (usListChar < 0x80 && !isprint((int)usListChar))) { /* * All remaining private area characters and all - * remaining non-printable ASCII characters to bullet + * remaining non-printable ASCII characters to their + * default bullet character */ DBG_HEX(usListChar); DBG_FIXME(); - usListChar = 0x2022; /* BULLET */ + if (ucNFC == LIST_SPECIAL || ucNFC == LIST_SPECIAL2) { + usListChar = 0x2190; /* LEFTWARDS ARROW */ + } else { + usListChar = 0x2022; /* BULLET */ + } } break; } - if (eEncoding == encoding_utf8) { + if (eEncoding == encoding_utf_8) { tLen = tUcs2Utf8(usListChar, szListChar, 4); szListChar[tLen] = '\0'; } else { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:177,183 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:184,190 case 0x2013: case 0x2500: szListChar[0] = '-'; break; - case 0x2199: case 0x2329: + case 0x2190: case 0x2199: case 0x2329: szListChar[0] = '<'; break; case 0x21d2: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylelist.c:386,391 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylelist.c:393,416 } return &pRecord->pNext->tInfo; } /* end of pGetNextStyleInfoListItem */ + + /* + * Get the next text style + */ + const style_block_type * + pGetNextTextStyle(const style_block_type *pCurr) + { + const style_block_type *pRecord; + + pRecord = pCurr; + do { + pRecord = pGetNextStyleInfoListItem(pRecord); + } while (pRecord != NULL && + (pRecord->eListID == hdrftr_list || + pRecord->eListID == macro_list || + pRecord->eListID == annotation_list)); + return pRecord; + } /* end of pGetNextTextStyle */ /* * usGetIstd - get the istd that belongs to the given file offset [jmk] --rw-rw-r-- M 499692 jmk sys 12060 Jan 14 12:57 sys/src/cmd/aux/antiword/stylelist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22114 Jan 14 12:57 sys/src/cmd/aux/antiword/stylesheet.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:1,6 /* * stylesheet.c - * Copyright (C) 2001,2002 A.J. van Os; Released under GPL + * Copyright (C) 2001-2004 A.J. van Os; Released under GNU GPL * * Description: * Build, read and destroy a list of stylesheet information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:52,61 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:52,68 * vGetDefaultFont - fill the font struct with default values */ static void - vGetDefaultFont(font_block_type *pFont) + vGetDefaultFont(font_block_type *pFont, USHORT usDefaultFontNumber) { (void)memset(pFont, 0, sizeof(*pFont)); pFont->usFontSize = DEFAULT_FONT_SIZE; + if (usDefaultFontNumber <= (USHORT)UCHAR_MAX) { + pFont->ucFontNumber = (UCHAR)usDefaultFontNumber; + } else { + DBG_DEC(usDefaultFontNumber); + DBG_FIXME(); + pFont->ucFontNumber = 0; + } } /* end of vGetDefaultFont */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:84,109 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:91,96 } /* end of iGetStyleIndex */ /* - * Convert a stylecode (stc) as used by WinWord 2 into a styleindex (istd) - * as used by Word 6 and up - */ - USHORT - usStc2istd(UCHAR ucStc) - { - /* Old nil style to new nil style */ - if (ucStc == 222) { - return STI_NIL; - } - /* Heading 1 through 9 must become istd 1 through 9 */ - /* so 254 through 246 must become 1 through 9 and vice versa */ - if ((ucStc >= 1 && ucStc <= 9) || - (ucStc >= 246 && ucStc <= 254)) { - return 255 - (USHORT)ucStc; - } - return (USHORT)ucStc; - } /* end of usStd2istd */ - - /* * Get a build-in style for Winword 1/2 */ static void /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:114,120 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:101,107 /* Start with de defaults */ vGetDefaultStyle(pStyle); - /* Add the build-in style */ + /* Add the build-in style info */ switch (ucStc) { case 246: case 247: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:155,163 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:142,150 fail(pFont == NULL); /* Start with de defaults */ - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, 0); - /* Add the build-in fontstyle */ + /* Add the build-in fontstyle info */ switch (ucStc) { case 223: case 244: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:198,203 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:185,211 } /* end of vGetBuildinFont */ /* + * Convert a stylecode (stc) as used by WinWord 1/2 into a styleindex (istd) + * as used by Word 6 and up + */ + USHORT + usStc2istd(UCHAR ucStc) + { + /* Old nil style to new nil style */ + if (ucStc == 222) { + return STI_NIL; + } + + /* Heading 1 through 9 must become istd 1 through 9 */ + /* so 254 through 246 must become 1 through 9 and vice versa */ + if ((ucStc >= 1 && ucStc <= 9) || + (ucStc >= 246 && ucStc <= 254)) { + return 255 - (USHORT)ucStc; + } + return (USHORT)ucStc; + } /* end of usStd2istd */ + + /* * Build the lists with Stylesheet Information for WinWord 1/2 files */ void /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:207,214 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:215,222 font_block_type *pFont; UCHAR *aucBuffer; ULONG ulBeginStshInfo; - size_t tStshInfoLen, tName, tChpx, tPapx; - int iStIndex, iChpxIndex, iPapxIndex, iMaxIndex, iSt, iChpx, iPapx; + size_t tStshInfoLen, tName, tChpx, tPapx, tMaxIndex; + int iStIndex, iChpxIndex, iPapxIndex, iSt, iChpx, iPapx; int iStd, iIndex, iBaseStyleIndex, iCounter; USHORT usBaseStyle; UCHAR ucStc, ucStcNext, ucStcBase; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:228,241 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:236,257 } NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen); + fail(2 > tStshInfoLen); iStd = (int)usGetWord(0, aucBuffer); + + fail(2 + 2 > tStshInfoLen); tName = (size_t)usGetWord(2, aucBuffer); + + fail(2 + tName + 2 > tStshInfoLen); tChpx = (size_t)usGetWord(2 + tName, aucBuffer); + + fail(2 + tName + tChpx + 2 > tStshInfoLen); tPapx = (size_t)usGetWord(2 + tName + tChpx, aucBuffer); + + fail(2 + tName + tChpx + tPapx + 2 > tStshInfoLen); tStdCount = (size_t)usGetWord(2 + tName + tChpx + tPapx, aucBuffer); NO_DBG_HEX(tStdCount); - fail(2 + tName + tChpx + tPapx + 2 + 2 * tStdCount > tStshInfoLen); atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:246,252 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:262,268 iStIndex = 2 + 2; iChpxIndex = 2 + (int)tName + 2; iPapxIndex = 2 + (int)tName + (int)tChpx + 2; - iMaxIndex = 2 + (int)tName + (int)tChpx + (int)tPapx + 2; + tMaxIndex = 2 + tName + tChpx + tPapx + 2; /* Read the styles one-by-one */ for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { pStyle = &atStyleInfo[iIndex]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:257,273 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:273,289 NO_DBG_HEX(iSt); NO_DBG_HEX(iChpx); NO_DBG_HEX(iPapx); - if (iSt == 0xff) { - /* Undefined style */ + if (iSt == 0xff || tMaxIndex + 1 >= tStshInfoLen) { + /* Undefined style or no information */ iStIndex++; iChpxIndex++; iPapxIndex++; - iMaxIndex += 2; + tMaxIndex += 2; if (!abFilled[iIndex]) { DBG_HEX_C(iChpx != 0xff, iChpx); DBG_HEX_C(iPapx != 0xff, iPapx); vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, 0); abFilled[iIndex] = TRUE; } continue; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:276,283 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:292,299 NO_DBG_STRN(aucBuffer + iStIndex + 1, iSt); iStIndex += iSt + 1; - ucStcNext = ucGetByte(iMaxIndex, aucBuffer); - ucStcBase = ucGetByte(iMaxIndex + 1, aucBuffer); + ucStcNext = ucGetByte(tMaxIndex, aucBuffer); + ucStcBase = ucGetByte(tMaxIndex + 1, aucBuffer); ucStc = (UCHAR)((iIndex - iStd) & 0xff); NO_DBG_DEC(ucStc); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:285,291 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:301,307 /* Use a build-in style */ iChpxIndex++; iPapxIndex++; - iMaxIndex += 2; + tMaxIndex += 2; if (!abFilled[iIndex]) { DBG_HEX_C(iChpx != 0xff, iChpx); DBG_HEX_C(iPapx != 0xff, iPapx); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:303,309 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:319,325 /* This record has already been filled */ iChpxIndex += iChpx + 1; iPapxIndex += iPapx + 1; - iMaxIndex += 2; + tMaxIndex += 2; continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:312,318 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:328,334 if (usBaseStyle == STI_NIL) { /* Based on the Nil style */ vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, 0); } else { iBaseStyleIndex = iGetStyleIndex(usBaseStyle); NO_DBG_DEC(iBaseStyleIndex); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:320,326 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:336,342 /* This style is not known yet */ iChpxIndex += iChpx + 1; iPapxIndex += iPapx + 1; - iMaxIndex += 2; + tMaxIndex += 2; continue; } fail(iBaseStyleIndex >= (int)tStdCount); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:370,389 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:386,407 iPapxIndex += iPapx + 1; break; } - iMaxIndex += 2; + tMaxIndex += 2; } NO_DBG_DEC(iCounter); } while (iCounter > 0); + /* Fill records that are still empty */ for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { if (!abFilled[iIndex]) { NO_DBG_DEC(iIndex); vGetDefaultStyle(&atStyleInfo[iIndex]); - vGetDefaultFont(&atFontInfo[iIndex]); + vGetDefaultFont(&atFontInfo[iIndex], 0); } } + /* Clean up before you leave */ abFilled = xfree(abFilled); aucBuffer = xfree(aucBuffer); } /* end of vGet2Stylesheet */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:403,408 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:421,427 size_t tPos, tNameLen, tUpxLen; int iIndex, iBaseStyleIndex, iCounter; USHORT usTmp, usUpxCount, usStyleType, usBaseStyle; + USHORT usFtcStandardChpStsh; fail(pFile == NULL || aucHeader == NULL); fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:425,430 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:444,451 tStdCount = (size_t)usGetWord(2, aucBuffer); NO_DBG_DEC(tStdCount); tStdBaseInFile = (size_t)usGetWord(4, aucBuffer); + usFtcStandardChpStsh = usGetWord(14, aucBuffer); + NO_DBG_DEC(usFtcStandardChpStsh); atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:448,454 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:469,475 if (tStdLen == 0) { /* Empty record */ vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, usFtcStandardChpStsh); abFilled[iIndex] = TRUE; continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:460,466 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:481,487 if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) { /* Based on the Nil style */ vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, usFtcStandardChpStsh); } else { iBaseStyleIndex = iGetStyleIndex(usBaseStyle); NO_DBG_DEC(iBaseStyleIndex); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:551,564 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:572,588 NO_DBG_DEC(iCounter); } while (iCounter > 0); + /* Fill records that are still empty */ for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { if (!abFilled[iIndex]) { NO_DBG_DEC(iIndex); vGetDefaultStyle(&atStyleInfo[iIndex]); - vGetDefaultFont(&atFontInfo[iIndex]); + vGetDefaultFont(&atFontInfo[iIndex], + usFtcStandardChpStsh); } } + /* Clean up before you leave */ abFilled = xfree(abFilled); aucBuffer = xfree(aucBuffer); } /* end of vGet6Stylesheet */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:577,587 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:601,611 const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulBeginStshInfo; - ULONG ulTableSize, ulTableStartBlock; size_t tStshInfoLen, tBlockDepotLen, tOffset, tStdLen, tStdBaseInFile; size_t tBlockSize, tPos, tNameLen, tUpxLen; int iIndex, iBaseStyleIndex, iCounter; - USHORT usDocStatus, usTmp, usUpxCount, usStyleType, usBaseStyle; + USHORT usTmp, usUpxCount, usStyleType, usBaseStyle; + USHORT usFtcStandardChpStsh; fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); fail(aulBBD == NULL || aulSBD == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:591,612 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:615,628 tStshInfoLen = (size_t)ulGetLong(0xa6, aucHeader); /* lcbStshf */ NO_DBG_DEC(tStshInfoLen); - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - NO_DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { + NO_DBG_DEC(pPPS->tTable.ulSB); + NO_DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { DBG_MSG("No stylesheet information"); return; } - NO_DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:618,624 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:634,640 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tStshInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginStshInfo, tStshInfoLen)) { aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:629,634 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:645,652 tStdCount = (size_t)usGetWord(2, aucBuffer); NO_DBG_DEC(tStdCount); tStdBaseInFile = (size_t)usGetWord(4, aucBuffer); + usFtcStandardChpStsh = usGetWord(14, aucBuffer); + NO_DBG_DEC(usFtcStandardChpStsh); atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:652,658 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:670,676 if (tStdLen == 0) { /* Empty record */ vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, usFtcStandardChpStsh); abFilled[iIndex] = TRUE; continue; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:664,670 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:682,688 if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) { /* Based on the Nil style */ vGetDefaultStyle(pStyle); - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, usFtcStandardChpStsh); } else { iBaseStyleIndex = iGetStyleIndex(usBaseStyle); NO_DBG_DEC(iBaseStyleIndex); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:757,770 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:775,791 NO_DBG_DEC(iCounter); } while (iCounter > 0); + /* Fill records that are still empty */ for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { if (!abFilled[iIndex]) { NO_DBG_DEC(iIndex); vGetDefaultStyle(&atStyleInfo[iIndex]); - vGetDefaultFont(&atFontInfo[iIndex]); + vGetDefaultFont(&atFontInfo[iIndex], + usFtcStandardChpStsh); } } + /* Clean up before you leave */ abFilled = xfree(abFilled); aucBuffer = xfree(aucBuffer); } /* end of vGet8Stylesheet */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/stylesheet.c:813,817 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/stylesheet.c:834,838 } } - vGetDefaultFont(pFont); + vGetDefaultFont(pFont, 0); } /* end of vFillFontFromStylesheet */ [jmk] --rw-rw-r-- M 499692 jmk sys 22114 Jan 14 12:57 sys/src/cmd/aux/antiword/stylesheet.c [jmk] --rw-rw-r-- M 499692 jmk sys 23077 Jan 14 12:57 sys/src/cmd/aux/antiword/summary.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:1,6 /* * summary.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 2002-2005 A.J. van Os; Released under GNU GPL * * Description: * Read the summary information of a Word document /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:49,55 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:49,55 void vDestroySummaryInfo(void) { - DBG_MSG("vDestroySummaryInfo"); + TRACE_MSG("vDestroySummaryInfo"); szTitle = xfree(szTitle); szSubject = xfree(szSubject); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:135,167 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:135,140 } /* end of tConvertDosDate */ /* - * tConvertDTTM - convert Windows Date and Time format - * - * returns Unix time_t or -1 - */ - static time_t - tConvertDTTM(ULONG ulDTTM) - { - struct tm tTime; - time_t tResult; - - if (ulDTTM == 0) { - return (time_t)-1; - } - memset(&tTime, 0, sizeof(tTime)); - tTime.tm_min = (int)(ulDTTM & 0x0000003f); - tTime.tm_hour = (int)((ulDTTM & 0x000007c0) >> 6); - tTime.tm_mday = (int)((ulDTTM & 0x0000f800) >> 11); - tTime.tm_mon = (int)((ulDTTM & 0x000f0000) >> 16); - tTime.tm_year = (int)((ulDTTM & 0x1ff00000) >> 20); - tTime.tm_isdst = -1; - tTime.tm_mon--; /* From 01-12 to 00-11 */ - tResult = mktime(&tTime); - NO_DBG_MSG(ctime(&tResult)); - return tResult; - } /* end of tConvertDTTM */ - - /* * szLpstr - get a zero terminate string property */ static char * /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:168,181 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:141,157 szLpstr(ULONG ulOffset, const UCHAR *aucBuffer) { char *szStart, *szResult, *szTmp; - size_t tTmp; + size_t tSize; - tTmp = (size_t)ulGetLong(ulOffset + 4, aucBuffer); - NO_DBG_DEC(tTmp); - NO_DBG_MSG(aucBuffer + ulOffset + 8); + tSize = (size_t)ulGetLong(ulOffset + 4, aucBuffer); + NO_DBG_DEC(tSize); + if (tSize == 0) { + return NULL; + } /* Remove white space from the start of the string */ szStart = (char *)aucBuffer + ulOffset + 8; - fail(strlen(szStart) >= tTmp); + NO_DBG_MSG(szStart); + fail(strlen(szStart) >= tSize); while (isspace(*szStart)) { szStart++; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:229,235 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:205,211 } /* end of tFiletime */ /* - * vAnalyseSummaryInfo - + * vAnalyseSummaryInfo - analyse the summary information */ static void vAnalyseSummaryInfo(const UCHAR *aucBuffer) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:286,292 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:262,268 } /* end of vAnalyseSummaryInfo */ /* - * vAnalyseDocumentSummaryInfo - + * vAnalyseDocumentSummaryInfo - analyse the document summary information */ static void vAnalyseDocumentSummaryInfo(const UCHAR *aucBuffer) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:451,456 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:427,434 size_t tLen; USHORT usCodepage, usOffset; + TRACE_MSG("vSet0SummaryInfo"); + fail(pFile == NULL || aucHeader == NULL); /* First check the header */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:514,519 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:492,499 ULONG ulBeginSumdInfo, ulBeginDocpInfo, ulTmp; size_t tSumdInfoLen, tDocpInfoLen, tLen, tCounter, tStart; + TRACE_MSG("vSet2SummaryInfo"); + fail(pFile == NULL || aucHeader == NULL); fail(iWordVersion != 1 && iWordVersion != 2); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:522,534 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:502,522 DBG_HEX(usLid); if (usLid < 999 && iWordVersion == 1) { switch (usLid) { - case 1: usLid = 0x0409; break; /* American English */ - case 2: usLid = 0x0c0c; break; /* Canadian French */ - case 31: usLid = 0x0413; break; /* Dutch */ - case 33: usLid = 0x040c; break; /* French */ - case 34: usLid = 0x040a; break; /* Spanish */ - case 44: usLid = 0x0809; break; /* British English */ - case 49: usLid = 0x0407; break; /* German */ + case 1: usLid = 0x0409; break; /* American English */ + case 2: usLid = 0x0c0c; break; /* Canadian French */ + case 31: usLid = 0x0413; break; /* Dutch */ + case 33: usLid = 0x040c; break; /* French */ + case 34: usLid = 0x040a; break; /* Spanish */ + case 36: usLid = 0x040e; break; /* Hungarian */ + case 39: usLid = 0x0410; break; /* Italian */ + case 44: usLid = 0x0809; break; /* British English */ + case 45: usLid = 0x0406; break; /* Danish */ + case 46: usLid = 0x041f; break; /* Swedish */ + case 47: usLid = 0x0414; break; /* Norwegian */ + case 48: usLid = 0x0415; break; /* Polish */ + case 49: usLid = 0x0407; break; /* German */ + case 351: usLid = 0x0816; break; /* Portuguese */ + case 358: usLid = 0x040b; break; /* Finnish */ default: DBG_DEC(usLid); DBG_FIXME(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:537,542 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:525,535 } } + if (iWordVersion != 2) { + /* Unknown where to find the associated strings */ + return; + } + /* Second check the associated strings */ ulBeginSumdInfo = ulGetLong(0x118, aucHeader); /* fcSttbfAssoc */ DBG_HEX(ulBeginSumdInfo); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:558,564 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:551,557 DBG_DEC_C(tSumdInfoLen != tLen, tSumdInfoLen); DBG_DEC_C(tSumdInfoLen != tLen, tLen); tStart = 1; - for (tCounter = 0; tCounter < 18; tCounter++) { + for (tCounter = 0; tCounter < 17; tCounter++) { if (tStart >= tSumdInfoLen) { break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:655,660 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:648,655 const ULONG *aulSBD, size_t tSBDLen, const UCHAR *aucHeader) { + TRACE_MSG("vSet6SummaryInfo"); + /* Header Information */ usLid = usGetWord(0x06, aucHeader); /* Language IDentification */ DBG_HEX(usLid); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:674,679 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:669,676 { USHORT usTmp; + TRACE_MSG("vSet8SummaryInfo"); + /* Header Information */ usTmp = usGetWord(0x0a, aucHeader); if (usTmp & BIT(14)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/summary.c:736,741 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/summary.c:733,782 pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday); return szTime; } /* end of szGetLastSaveDtm */ + + /* + * szGetModDate - get the last save date field + */ + const char * + szGetModDate(void) + { + static char szTime[20]; + struct tm *pTime; + + if (tLastSaveDtm == (time_t)-1) { + return NULL; + } + pTime = localtime(&tLastSaveDtm); + if (pTime == NULL) { + return NULL; + } + sprintf(szTime, "D:%04d%02d%02d%02d%02d", + pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday, + pTime->tm_hour, pTime->tm_min); + return szTime; + } /* end of szGetModDate */ + + /* + * szGetCreationDate - get the last save date field + */ + const char * + szGetCreationDate(void) + { + static char szTime[20]; + struct tm *pTime; + + if (tCreateDtm == (time_t)-1) { + return NULL; + } + pTime = localtime(&tCreateDtm); + if (pTime == NULL) { + return NULL; + } + sprintf(szTime, "D:%04d%02d%02d%02d%02d", + pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday, + pTime->tm_hour, pTime->tm_min); + return szTime; + } /* end of szGetCreationDate */ /* * szGetCompany - get the company field [jmk] --rw-rw-r-- M 499692 jmk sys 23077 Jan 14 12:57 sys/src/cmd/aux/antiword/summary.c [jmk] --rw-rw-r-- M 499692 jmk sys 5122 Jan 14 12:57 sys/src/cmd/aux/antiword/tabstop.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:1,6 /* * tabstops.c - * Copyright (C) 1999-2002 A.J. van Os; Released under GPL + * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL * * Description: * Read the tab stop information from a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:109,117 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:109,116 const ULONG *aulBlockDepot; UCHAR *aucBuffer; ULONG ulBeginDocpInfo; - ULONG ulTableSize, ulTableStartBlock; size_t tDocpInfoLen, tBlockDepotLen, tBlockSize; - USHORT usDocStatus, usTmp; + USHORT usTmp; ulBeginDocpInfo = ulGetLong(0x192, aucHeader); /* fcDop */ DBG_HEX(ulBeginDocpInfo); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:122,144 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:121,134 return; } - /* Use 0Table or 1Table? */ - usDocStatus = usGetWord(0x0a, aucHeader); - if (usDocStatus & BIT(9)) { - ulTableStartBlock = pPPS->t1Table.ulSB; - ulTableSize = pPPS->t1Table.ulSize; - } else { - ulTableStartBlock = pPPS->t0Table.ulSB; - ulTableSize = pPPS->t0Table.ulSize; - } - DBG_DEC(ulTableStartBlock); - if (ulTableStartBlock == 0) { - DBG_DEC(ulTableStartBlock); + DBG_DEC(pPPS->tTable.ulSB); + DBG_HEX(pPPS->tTable.ulSize); + if (pPPS->tTable.ulSize == 0) { DBG_MSG("No TAB information"); return; } - DBG_HEX(ulTableSize); - if (ulTableSize < MIN_SIZE_FOR_BBD_USE) { + + if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { /* Use the Small Block Depot */ aulBlockDepot = aulSBD; tBlockDepotLen = tSBDLen; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:150,156 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:140,146 tBlockSize = BIG_BLOCK_SIZE; } aucBuffer = xmalloc(tDocpInfoLen); - if (!bReadBuffer(pFile, ulTableStartBlock, + if (!bReadBuffer(pFile, pPPS->tTable.ulSB, aulBlockDepot, tBlockDepotLen, tBlockSize, aucBuffer, ulBeginDocpInfo, tDocpInfoLen)) { aucBuffer = xfree(aucBuffer); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:206,211 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:196,202 } } /* end of vSetDefaultTabWidth */ + #if 0 /* * lGetDefaultTabWidth - Get the default tabwidth in millipoints */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/tabstop.c:218,220 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/tabstop.c:209,212 } return lDefaultTabWidth; } /* end of lGetDefaultTabWidth */ + #endif [jmk] --rw-rw-r-- M 499692 jmk sys 5122 Jan 14 12:57 sys/src/cmd/aux/antiword/tabstop.c [jmk] --rw-rw-r-- M 499692 jmk sys 3878 Jan 14 12:57 sys/src/cmd/aux/antiword/text.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/text.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/text.c:1,6 /* * text.c - * Copyright (C) 1999-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL * * Description: * Functions to deal with the Text format /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/text.c:59,71 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/text.c:59,71 return; } - if (eEncoding == encoding_utf8) { + if (eEncoding == encoding_utf_8) { fprintf(pFile, "%.*s", (int)tStringLength, szString); return; } if (ucNbsp == 0) { - ucNbsp = ucGetNbspValue(); + ucNbsp = ucGetNbspCharacter(); DBG_HEX_C(ucNbsp != 0xa0, ucNbsp); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/text.c:80,92 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/text.c:80,92 } /* end of vPrintTXT */ /* - * vMoveToTXT - move to the given X,Y coordinates (Text) + * vMoveTo - move to the given X,Y coordinates * * Move the current position of the given diagram to its X,Y coordinates, * start on a new page if needed */ static void - vMoveToTXT(diagram_type *pDiag) + vMoveTo(diagram_type *pDiag) { int iCount, iNbr; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/text.c:100,106 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/text.c:100,106 } lYtopCurr = pDiag->lYtop; } - } /* end of vMoveToTXT */ + } /* end of vMoveTo */ /* * vMove2NextLineTXT - move to the next line /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/text.c:131,137 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/text.c:131,137 return; } - vMoveToTXT(pDiag); + vMoveTo(pDiag); vPrintTXT(pDiag->pOutFile, szString, tStringLength); pDiag->lXleft += lStringWidth; } /* end of vSubstringTXT */ [jmk] --rw-rw-r-- M 499692 jmk sys 3878 Jan 14 12:57 sys/src/cmd/aux/antiword/text.c [jmk] --rw-rw-r-- M 499692 jmk sys 818 Jan 14 12:57 sys/src/cmd/aux/antiword/unix.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/unix.c:35,45 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/unix.c:35,45 } /* end of werr */ void - visdelay_begin(void) + Hourglass_On(void) { - } /* end of visdelay_begin */ + } /* end of Hourglass_On */ void - visdelay_end(void) + Hourglass_Off(void) { - } /* end of visdelay_end */ + } /* end of Hourglass_Off */ [jmk] --rw-rw-r-- M 499692 jmk sys 818 Jan 14 12:57 sys/src/cmd/aux/antiword/unix.c [jmk] --rw-rw-r-- M 499692 jmk sys 7564 Jan 14 12:57 sys/src/cmd/aux/antiword/utf8.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/utf8.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/utf8.c:1,6 /* * utf8.c - * Copyright (C) 2001-2003 A.J. van Os; Released under GPL + * Copyright (C) 2001-2004 A.J. van Os; Released under GPL * *==================================================================== * This part of the software is based on: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/utf8.c:154,195 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/utf8.c:154,198 * Fills in the number of bytes in the UTF-8 character */ static ULONG - utf8_to_ucs(const char *p, int *utflen) + utf8_to_ucs(const char *p, int iStrLen, int *piUtfLen) { - ULONG wc; - int j, charlen; + ULONG ulUcs; + int iIndex, iCharLen; - fail(p == NULL || utflen == NULL); + fail(p == NULL || piUtfLen == NULL); + fail(iStrLen < 1); - wc = (ULONG)(UCHAR)p[0]; + ulUcs = (ULONG)(UCHAR)p[0]; - if (wc < 0x80) { - *utflen = 1; - return wc; + if (ulUcs < 0x80) { + *piUtfLen = 1; + return ulUcs; } - if (wc < 0xe0){ - charlen = 2; - wc &= 0x1f; - } else if (wc < 0xf0){ - charlen = 3; - wc &= 0x0f; - } else if (wc < 0xf8){ - charlen = 4; - wc &= 0x07; - } else if (wc < 0xfc){ - charlen = 5; - wc &= 0x03; + if (ulUcs < 0xe0){ + iCharLen = 2; + ulUcs &= 0x1f; + } else if (ulUcs < 0xf0){ + iCharLen = 3; + ulUcs &= 0x0f; + } else if (ulUcs < 0xf8){ + iCharLen = 4; + ulUcs &= 0x07; + } else if (ulUcs < 0xfc){ + iCharLen = 5; + ulUcs &= 0x03; } else { - charlen = 6; - wc &= 0x01; + iCharLen = 6; + ulUcs &= 0x01; } - for (j = 1; j < charlen; j++) { - wc <<= 6; - wc |= (UCHAR)p[j] & 0x3f; + for (iIndex = 1; iIndex < iCharLen; iIndex++) { + ulUcs <<= 6; + if (iIndex < iStrLen) { + ulUcs |= (ULONG)(UCHAR)p[iIndex] & 0x3f; + } } - *utflen = charlen; - return wc; + *piUtfLen = iCharLen; + return ulUcs; } /* end of utf8_to_ucs */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/utf8.c:198,225 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/utf8.c:201,228 * Returns the string width in columns */ long - utf8_strwidth(const char *p, size_t numchars) + utf8_strwidth(const char *pcString, size_t tNumchars) { - const char *maxp; - ULONG ucs; - long width, totwidth; - int utflen; + ULONG ulUcs; + long lTotal; + int iToGo, iWidth, iUtflen; - fail(p == NULL); + fail(pcString == NULL || tNumchars > (size_t)INT_MAX); - totwidth = 0; - maxp = p + numchars; + lTotal = 0; + iToGo = (int)tNumchars; - while (*p != '\0' && p < maxp) { - ucs = utf8_to_ucs(p, &utflen); - width = iWcWidth(ucs); - if (width > 0) { - totwidth += width; + while (iToGo > 0 && *pcString != '\0') { + ulUcs = utf8_to_ucs(pcString, iToGo, &iUtflen); + iWidth = iWcWidth(ulUcs); + if (iWidth > 0) { + lTotal += iWidth; } - p += utflen; + pcString += iUtflen; + iToGo -= iUtflen; } - NO_DBG_DEC(totwidth); - return totwidth; + NO_DBG_DEC(lTotal); + return lTotal; } /* end of utf8_strwidth */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/utf8.c:230,298 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/utf8.c:233,260 int utf8_chrlength(const char *p) { - int utflen; + int iUtflen; fail(p == NULL); - utflen = -1; /* Just to make sure */ - (void)utf8_to_ucs(p, &utflen); - NO_DBG_DEC(utflen); - return utflen; + iUtflen = -1; /* Just to make sure */ + (void)utf8_to_ucs(p, INT_MAX, &iUtflen); + NO_DBG_DEC(iUtflen); + return iUtflen; } /* end of utf8_chrlength */ /* - * Original version: - * Copyright (C) 1999 Bruno Haible + * is_locale_utf8 - return TRUE if the locale is UTF-8 */ BOOL is_locale_utf8(void) { - const char *locale, *cp, *encoding; + char szCodeset[20]; - /* - * Determine the current locale the same way as setlocale() does, - * according to POSIX. - */ - locale = getenv("LC_ALL"); - if (locale == NULL || locale[0] == '\0') { - locale = getenv("LC_CTYPE"); - if (locale == NULL || locale[0] == '\0') { - locale = getenv("LANG"); - } - } - - if (locale == NULL || locale[0] == '\0') { + szCodeset[0] = '\0'; + if (!bGetNormalizedCodeset(szCodeset, sizeof(szCodeset), NULL)) { return FALSE; } - - /* The most general syntax of a locale (not all optional parts - * recognized by all systems) is - * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]] - * To retrieve the codeset, search the first dot. Stop searching when - * a '@' or '+' or ',' is encountered. - */ - for (cp = locale; - *cp != '\0' && *cp != '@' && *cp != '+' && *cp != ','; - cp++) { - if (*cp != '.') { - continue; - } - encoding = cp + 1; - for (cp = encoding; - *cp != '\0' && *cp != '@' && *cp != '+' && *cp != ','; - cp++) - ; /* EMPTY */ - /* - * The encoding is now contained in the part from encoding to - * cp. Check it for "UTF-8", which is the only official IANA - * name of UTF-8. Also check for the lowercase-no-dashes - * version, which is what some SystemV systems use. - */ - if ((cp - encoding == 5 && STRNEQ(encoding, "UTF-8", 5)) || - (cp - encoding == 4 && STRNEQ(encoding, "utf8", 4))) { - return TRUE; - } - return FALSE; - } - return FALSE; + DBG_MSG(szCodeset); + return STREQ(szCodeset, "utf8"); } /* end of is_locale_utf8 */ [jmk] --rw-rw-r-- M 499692 jmk sys 7564 Jan 14 12:57 sys/src/cmd/aux/antiword/utf8.c [jmk] --rw-rw-r-- M 499692 jmk sys 800 Jan 14 12:57 sys/src/cmd/aux/antiword/version.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/version.h:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/version.h:1,6 /* * version.h - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Version and release information /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/version.h:13,24 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/version.h:13,32 #define PURPOSESTRING "Display MS-Word files" #if defined(__riscos) - #define AUTHORSTRING "� 1998-2003 Adri van Os" + #define AUTHORSTRING "� 1998-2005 Adri van Os" #else - #define AUTHORSTRING "(C) 1998-2003 Adri van Os" + #define AUTHORSTRING "(C) 1998-2005 Adri van Os" #endif /* __riscos */ - #define VERSIONSTRING "0.34 (25 Aug 2003)" + #define VERSIONSTRING "0.37 (21 Oct 2005)" + + #if defined(__dos) + #if defined(__DJGPP__) + #define VERSIONSTRING2 " # 32-bit Protected Mode" + #else + #define VERSIONSTRING2 " # 16-bit Real Mode" + #endif /* __DJGPP__ */ + #endif /* __dos */ #if defined(DEBUG) #define STATUSSTRING "DEBUG version" [jmk] --rw-rw-r-- M 499692 jmk sys 800 Jan 14 12:57 sys/src/cmd/aux/antiword/version.h [jmk] --rw-rw-r-- M 499692 jmk sys 39070 Jan 14 12:57 sys/src/cmd/aux/antiword/word2text.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1,9 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1,9 /* * word2text.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: - * MS Word to text functions + * MS Word to "text" functions */ #include /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:11,17 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:11,18 #include #include #if defined(__riscos) - #include "visdelay.h" + #include "DeskLib:Hourglass.h" + #include "drawfile.h" #endif /* __riscos */ #include "antiword.h" /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:24,29 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:25,31 #define OUTPUT_LINE() \ do {\ vAlign2Window(pDiag, pAnchor, lWidthMax, ucAlignment);\ + TRACE_MSG("after vAlign2Window");\ pAnchor = pStartNewOutput(pAnchor, NULL);\ pOutput = pAnchor;\ } while(0) /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:43,49 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:45,51 #endif /* __riscos */ /* The document is in the format belonging to this version of Word */ static int iWordVersion = -1; - /* Special treatment for files from Word 6 on an Apple Macintosh */ + /* Special treatment for files from Word 4/5/6 on an Apple Macintosh */ static BOOL bOldMacFile = FALSE; /* Section Information */ static const section_block_type *pSection = NULL; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:82,88 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:84,90 ulCharCounter++; iCurrPct = (int)((ulCharCounter * 100) / ulDocumentLength); if (iCurrPct != iPrevPct) { - visdelay_percent(iCurrPct); + Hourglass_Percentage(iCurrPct); iPrevPct = iCurrPct; } #endif /* __riscos */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:91,100 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:93,102 /* * bOutputContainsText - see if the output contains more than white space */ - static BOOL - bOutputContainsText(output_type *pAnchor) + BOOL + bOutputContainsText(const output_type *pAnchor) { - output_type *pCurr; + const output_type *pCurr; size_t tIndex; fail(pAnchor == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:120,128 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:122,130 * lTotalStringWidth - compute the total width of the output string */ static long - lTotalStringWidth(output_type *pAnchor) + lTotalStringWidth(const output_type *pAnchor) { - output_type *pCurr; + const output_type *pCurr; long lTotal; lTotal = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:168,174 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:170,176 fail(pOutput == NULL); - if (tOptions.eEncoding == encoding_utf8 && bChangeAllowed) { + if (tOptions.eEncoding == encoding_utf_8 && bChangeAllowed) { DBG_HEX_C(ulChar > 0xffff, ulChar); fail(ulChar > 0xffff); tLen = tUcs2Utf8(ulChar, szResult, sizeof(szResult)); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:208,214 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:210,216 fail(szString == NULL || pOutput == NULL); for (tIndex = 0; tIndex < tStringLength; tIndex++) { - vStoreCharacter((UCHAR)szString[tIndex], pOutput); + vStoreCharacter((ULONG)(UCHAR)szString[tIndex], pOutput); } } /* end of vStoreString */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:261,267 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:263,270 if (tOptions.eConversionType == conversion_xml) { vSetHeaders(pDiag, pStyle->usIstd); } else { - tLen = tStyle2Window(szString, pStyle, pSection); + tLen = tStyle2Window(szString, sizeof(szString), + pStyle, pSection); vStoreString(szString, tLen, pOutput); } } /* end of vStoreStyle */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:306,312 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:309,315 } #if defined(DEBUG) - if (tOptions.eEncoding == encoding_utf8) { + if (tOptions.eEncoding == encoding_utf_8) { fail(strlen(szListChar) > 3); } else { DBG_HEX_C(iscntrl((int)szListChar[0]), szListChar[0]); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:317,322 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:320,326 switch (ucNFC) { case LIST_ARABIC_NUM: + case LIST_NUMBER_TXT: tNextFree = (size_t)sprintf(szLine, "%u", uiListNumber); break; case LIST_UPPER_ROMAN: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:330,335 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:334,340 ucNFC == LIST_UPPER_ALPHA, szLine); break; case LIST_ORDINAL_NUM: + case LIST_ORDINAL_TXT: if (uiListNumber % 10 == 1 && uiListNumber != 11) { tNextFree = (size_t)sprintf(szLine, "%ust", uiListNumber); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:344,355 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:349,364 (size_t)sprintf(szLine, "%uth", uiListNumber); } break; + case LIST_OUTLINE_NUM: + tNextFree = (size_t)sprintf(szLine, "%02u", uiListNumber); + break; case LIST_SPECIAL: + case LIST_SPECIAL2: case LIST_BULLETS: tNextFree = 0; break; default: - DBG_DEC(ucNFC); + DBG_HEX(ucNFC); DBG_FIXME(); tNextFree = (size_t)sprintf(szLine, "%u", uiListNumber); break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:365,371 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:374,380 } vSetLeftIndentation(pDiag, lLeftIndentation); for (tIndex = 0; tIndex < tNextFree; tIndex++) { - vStoreChar((UCHAR)szLine[tIndex], FALSE, pOutput); + vStoreChar((ULONG)(UCHAR)szLine[tIndex], FALSE, pOutput); } } /* end of vPutIndentation */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:406,411 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:415,422 { output_type *pNew; + TRACE_MSG("pStartNextOutput"); + if (pCurrent->tNextFree == 0) { /* The current record is empty, re-use */ fail(pCurrent->szStorage[0] != '\0'); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:422,428 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:433,439 pNew->lStringWidth = 0; pNew->ucFontColor = FONT_COLOR_DEFAULT; pNew->usFontStyle = FONT_REGULAR; - pNew->tFontRef = (draw_fontref)0; + pNew->tFontRef = (drawfile_fontref)0; pNew->usFontSize = DEFAULT_FONT_SIZE; pNew->pPrev = pCurrent; pNew->pNext = NULL; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:437,452 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:448,466 { output_type *pCurr, *pNext; USHORT usFontStyle, usFontSize; - draw_fontref tFontRef; + drawfile_fontref tFontRef; UCHAR ucFontColor; + TRACE_MSG("pStartNewOutput"); + ucFontColor = FONT_COLOR_DEFAULT; usFontStyle = FONT_REGULAR; - tFontRef = (draw_fontref)0; + tFontRef = (drawfile_fontref)0; usFontSize = DEFAULT_FONT_SIZE; /* Free the old output space */ pCurr = pAnchor; while (pCurr != NULL) { + TRACE_MSG("Free the old output space"); pNext = pCurr->pNext; pCurr->szStorage = xfree(pCurr->szStorage); if (pCurr->pNext == NULL) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:460,468 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:474,486 } if (pLeftOver == NULL) { /* Create new output space */ + TRACE_MSG("Create new output space"); pLeftOver = xmalloc(sizeof(*pLeftOver)); pLeftOver->tStorageSize = INITIAL_SIZE; + NO_DBG_DEC(pLeftOver->tStorageSize); + TRACE_MSG("before 2nd xmalloc"); pLeftOver->szStorage = xmalloc(pLeftOver->tStorageSize); + TRACE_MSG("after 2nd xmalloc"); pLeftOver->szStorage[0] = '\0'; pLeftOver->tNextFree = 0; pLeftOver->lStringWidth = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:486,492 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:504,510 ulGetChar(FILE *pFile, list_id_enum eListID) { const font_block_type *pCurr; - ULONG ulChar, ulFileOffset, ulTextOffset; + ULONG ulChar, ulFileOffset, ulCharPos; row_info_enum eRowInfo; USHORT usChar, usPropMod; BOOL bSkip; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:497,503 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:515,521 bSkip = FALSE; for (;;) { usChar = usNextChar(pFile, eListID, - &ulFileOffset, &ulTextOffset, &usPropMod); + &ulFileOffset, &ulCharPos, &usPropMod); if (usChar == (USHORT)EOF) { return (ULONG)EOF; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:583,589 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:601,607 } if (ulChar == PAGE_BREAK) { /* Might be the start of a new section */ - pSectionNext = pGetSectionInfo(pSection, ulTextOffset); + pSectionNext = pGetSectionInfo(pSection, ulCharPos); } return ulChar; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:590,597 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:608,637 } /* end of ulGetChar */ /* - * bWordDecryptor - translate Word to text or PostScript + * lGetWidthMax - get the maximum line width from the paragraph break value * + * Returns the maximum line width in millipoints + */ + static long + lGetWidthMax(int iParagraphBreak) + { + fail(iParagraphBreak < 0); + + if (iParagraphBreak == 0) { + return LONG_MAX; + } + if (iParagraphBreak < MIN_SCREEN_WIDTH) { + return lChar2MilliPoints(MIN_SCREEN_WIDTH); + } + if (iParagraphBreak > MAX_SCREEN_WIDTH) { + return lChar2MilliPoints(MAX_SCREEN_WIDTH); + } + return lChar2MilliPoints(iParagraphBreak); + } /* end of lGetWidthMax */ + + /* + * bWordDecryptor - turn Word to something more useful + * * returns TRUE when succesful, otherwise FALSE */ BOOL /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:605,611 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:645,651 ULONG ulChar; long lBeforeIndentation, lAfterIndentation; long lLeftIndentation, lLeftIndentation1, lRightIndentation; - long lWidthCurr, lWidthMax, lDefaultTabWidth, lTmp; + long lWidthCurr, lWidthMax, lDefaultTabWidth, lHalfSpaceWidth, lTmp; list_id_enum eListID; image_info_enum eRes; UINT uiFootnoteNumber, uiEndnoteNumber, uiTmp; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:620,626 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:660,666 fail(pFile == NULL || lFilesize <= 0 || pDiag == NULL); - DBG_MSG("bWordDecryptor"); + TRACE_MSG("bWordDecryptor"); iWordVersion = iInitDocument(pFile, lFilesize); if (iWordVersion < 0) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:627,632 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:667,678 DBG_DEC(iWordVersion); return FALSE; } + + vGetOptions(&tOptions); + bOldMacFile = bIsOldMacFile(); + vPrepareHdrFtrText(pFile); + vPrepareFootnoteText(pFile); + vPrologue2(pDiag, iWordVersion); /* Initialisation */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:636,642 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:682,687 iPrevPct = -1; ulDocumentLength = ulGetDocumentLength(); #endif /* __riscos */ - bOldMacFile = bIsOldMacFile(); pSection = pGetSectionInfo(NULL, 0); pSectionNext = pSection; lDefaultTabWidth = lGetDefaultTabWidth(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:651,657 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:696,702 bIsTableRow = FALSE; bWasTableRow = FALSE; vResetStyles(); - pStyleInfo = pGetNextStyleInfoListItem(NULL); + pStyleInfo = pGetNextTextStyle(NULL); bStartStyle = FALSE; bInList = FALSE; bWasInList = FALSE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:683,689 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:728,733 bNoMarks = TRUE; bFirstLine = TRUE; ucNFC = LIST_BULLETS; - vGetOptions(&tOptions); if (pStyleInfo != NULL) { szListChar = pStyleInfo->szListChar; pStyleTmp = pStyleInfo; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:700,718 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:744,753 bAllCapitals = FALSE; bHiddenText = FALSE; bMarkDelText = FALSE; - fail(tOptions.iParagraphBreak < 0); - if (tOptions.iParagraphBreak == 0) { - lWidthMax = LONG_MAX; - } else if (tOptions.iParagraphBreak < MIN_SCREEN_WIDTH) { - lWidthMax = lChar2MilliPoints(MIN_SCREEN_WIDTH); - } else if (tOptions.iParagraphBreak > MAX_SCREEN_WIDTH) { - lWidthMax = lChar2MilliPoints(MAX_SCREEN_WIDTH); - } else { - lWidthMax = lChar2MilliPoints(tOptions.iParagraphBreak); - } + lWidthMax = lGetWidthMax(tOptions.iParagraphBreak); NO_DBG_DEC(lWidthMax); - visdelay_begin(); + Hourglass_On(); uiFootnoteNumber = 0; uiEndnoteNumber = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:727,739 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:762,778 } switch (eListID) { case text_list: - eListID = footnote_list; - if (uiFootnoteNumber != 0) { - vPutSeparatorLine(pAnchor); - OUTPUT_LINE(); - uiFootnoteNumber = 0; + if (tOptions.eConversionType != + conversion_xml) { + eListID = footnote_list; + if (uiFootnoteNumber != 0) { + vPutSeparatorLine(pAnchor); + OUTPUT_LINE(); + uiFootnoteNumber = 0; + } + break; } - break; + /* No break or return */ case footnote_list: eListID = endnote_list; if (uiEndnoteNumber != 0) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:834,840 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:873,879 case PAGE_BREAK: case COLUMN_FEED: if (bIsTableRow) { - vStoreCharacter((ULONG)'\n', pOutput); + /* Ignore when in a table */ break; } if (bOutputContainsText(pAnchor)) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:843,850 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:882,889 RESET_LINE(); } if (ulChar == PAGE_BREAK) { - vEndOfPage(pDiag, - lAfterIndentation); + vEndOfPage(pDiag, lAfterIndentation, + pSection != pSectionNext); } else { vEndOfParagraph(pDiag, pOutput->tFontRef, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:945,952 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:984,990 } bWasInList = bInList; if (bStartStyle) { - pStyleInfo = - pGetNextStyleInfoListItem(pStyleInfo); + pStyleInfo = pGetNextTextStyle(pStyleInfo); NO_DBG_HEX_C(pStyleInfo != NULL, pStyleInfo->ulFileOffset); DBG_MSG_C(pStyleInfo == NULL, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1015,1020 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1053,1063 break; case FOOTNOTE_CHAR: uiFootnoteNumber++; + if (tOptions.eConversionType == conversion_xml) { + vStoreCharacter((ULONG)FOOTNOTE_OR_ENDNOTE, + pOutput); + break; + } vStoreCharacter((ULONG)'[', pOutput); vStoreNumberAsDecimal(uiFootnoteNumber, pOutput); vStoreCharacter((ULONG)']', pOutput); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1033,1039 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1076,1088 vStoreCharacter((ULONG)'\n', pOutput); break; } - OUTPUT_LINE(); + if (bOutputContainsText(pAnchor)) { + OUTPUT_LINE(); + } else { + vMove2NextLine(pDiag, + pOutput->tFontRef, pOutput->usFontSize); + RESET_LINE(); + } vEndOfParagraph(pDiag, pOutput->tFontRef, pOutput->usFontSize, /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1047,1055 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1096,1106 } if (bOutputContainsText(pAnchor)) { OUTPUT_LINE(); - } - vMove2NextLine(pDiag, + } else { + vMove2NextLine(pDiag, pOutput->tFontRef, pOutput->usFontSize); + RESET_LINE(); + } break; case PAGE_BREAK: case COLUMN_FEED: /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1070,1080 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1121,1135 break; } if (tOptions.iParagraphBreak == 0 && - tOptions.eConversionType == conversion_text) { + (tOptions.eConversionType == conversion_text || + tOptions.eConversionType == conversion_fmt_text)) { /* No logical lines, so no tab expansion */ vStoreCharacter(TAB, pOutput); break; } + lHalfSpaceWidth = (lComputeSpaceWidth( + pOutput->tFontRef, + pOutput->usFontSize) + 1) / 2; lTmp = lTotalStringWidth(pAnchor); lTmp += lDrawUnits2MilliPoints(pDiag->lXleft); lTmp /= lDefaultTabWidth; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1090,1103 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1145,1162 if (bHiddenText && tOptions.bHideHiddenText) { continue; } - if (bMarkDelText && - tOptions.eConversionType != conversion_ps) { + if (bMarkDelText && tOptions.bRemoveRemovedText) { continue; } - if (bAllCapitals) { - ulChar = ulToUpper(ulChar); + if (ulChar == UNICODE_ELLIPSIS && + tOptions.eEncoding != encoding_utf_8) { + vStoreString("...", 3, pOutput); + } else { + if (bAllCapitals) { + ulChar = ulToUpper(ulChar); + } + vStoreCharacter(ulChar, pOutput); } - vStoreCharacter(ulChar, pOutput); break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1124,1130 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1183,1191 /* End of a table row */ if (bEndRowNorm) { fail(pRowInfo == NULL); - vTableRow2Window(pDiag, pAnchor, pRowInfo); + vTableRow2Window(pDiag, pAnchor, pRowInfo, + tOptions.eConversionType, + tOptions.iParagraphBreak); } else { fail(!bEndRowFast); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/word2text.c:1167,1172 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/word2text.c:1228,1505 pAnchor = xfree(pAnchor); vCloseFont(); vFreeDocument(); - visdelay_end(); + Hourglass_Off(); return TRUE; } /* end of bWordDecryptor */ + + /* + * lLastStringWidth - compute the width of the last part of the output string + */ + static long + lLastStringWidth(const output_type *pAnchor) + { + const output_type *pCurr, *pStart; + + pStart = NULL; + for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { + if (pCurr->tNextFree == 1 && + (pCurr->szStorage[0] == PAR_END || + pCurr->szStorage[0] == HARD_RETURN)) { + /* Found a separator. Start after the separator */ + pStart = pCurr->pNext; + } + } + if (pStart == NULL) { + /* No separators. Use the whole output string */ + pStart = pAnchor; + } + return lTotalStringWidth(pStart); + } /* end of lLastStringWidth */ + + /* + * pHdrFtrDecryptor - turn a header/footer list element to something useful + */ + output_type * + pHdrFtrDecryptor(FILE *pFile, ULONG ulCharPosStart, ULONG ulCharPosNext) + { + output_type *pAnchor, *pOutput, *pLeftOver; + ULONG ulChar, ulFileOffset, ulCharPos; + long lWidthCurr, lWidthMax; + long lRightIndentation; + USHORT usChar; + UCHAR ucAlignment; + BOOL bSkip; + + fail(iWordVersion < 0); + fail(tOptions.eConversionType == conversion_unknown); + fail(tOptions.eEncoding == 0); + + if (ulCharPosStart == ulCharPosNext) { + /* There are no bytes to decrypt */ + return NULL; + } + + lRightIndentation = 0; + ucAlignment = ALIGNMENT_LEFT; + bSkip = FALSE; + lWidthMax = lGetWidthMax(tOptions.iParagraphBreak); + pAnchor = pStartNewOutput(NULL, NULL); + pOutput = pAnchor; + pOutput->tFontRef = tOpenFont(0, FONT_REGULAR, DEFAULT_FONT_SIZE); + usChar = usToHdrFtrPosition(pFile, ulCharPosStart); + ulCharPos = ulCharPosStart; + ulFileOffset = ulCharPos2FileOffset(ulCharPos); + while (usChar != (USHORT)EOF && ulCharPos != ulCharPosNext) { + /* Skip embedded characters */ + if (usChar == START_EMBEDDED) { + bSkip = TRUE; + } else if (usChar == END_IGNORE || usChar == END_EMBEDDED) { + bSkip = FALSE; + } + /* Translate character */ + if (bSkip || usChar == END_IGNORE || usChar == END_EMBEDDED) { + ulChar = IGNORE_CHARACTER; + } else { + ulChar = ulTranslateCharacters(usChar, + ulFileOffset, + iWordVersion, + tOptions.eConversionType, + tOptions.eEncoding, + bOldMacFile); + } + /* Process character */ + if (ulChar != IGNORE_CHARACTER) { + switch (ulChar) { + case PICTURE: + vStoreString("[pic]", 5, pOutput); + break; + case PAR_END: + case HARD_RETURN: + case PAGE_BREAK: + case COLUMN_FEED: + /* To the next substring */ + pOutput = pStartNextOutput(pOutput); + vCloseFont(); + pOutput->tFontRef = tOpenFont(0, + FONT_REGULAR, DEFAULT_FONT_SIZE); + /* A substring with just one character */ + if (ulChar == HARD_RETURN) { + vStoreCharacter(HARD_RETURN, pOutput); + } else { + vStoreCharacter(PAR_END, pOutput); + } + /* To the next substring */ + pOutput = pStartNextOutput(pOutput); + vCloseFont(); + pOutput->tFontRef = tOpenFont(0, + FONT_REGULAR, DEFAULT_FONT_SIZE); + fail(!bCheckDoubleLinkedList(pAnchor)); + break; + case TABLE_SEPARATOR: + vStoreCharacter((ULONG)' ', pOutput); + vStoreCharacter((ULONG)TABLE_SEPARATOR_CHAR, + pOutput); + break; + case TAB: + vStoreCharacter((ULONG)FILLER_CHAR, pOutput); + break; + default: + vStoreCharacter(ulChar, pOutput); + break; + } + } + lWidthCurr = lLastStringWidth(pAnchor); + if (lWidthCurr >= lWidthMax + lRightIndentation) { + pLeftOver = pSplitList(pAnchor); + for (pOutput = pAnchor; + pOutput->pNext != NULL; + pOutput = pOutput->pNext) + ; /* EMPTY */ + fail(pOutput == NULL); + /* To the next substring */ + pOutput = pStartNextOutput(pOutput); + /* A substring with just one HARD_RETURN */ + vStoreCharacter(HARD_RETURN, pOutput); + /* Put the leftover piece(s) at the end */ + pOutput->pNext = pLeftOver; + if (pLeftOver != NULL) { + pLeftOver->pPrev = pOutput; + } + fail(!bCheckDoubleLinkedList(pAnchor)); + for (pOutput = pAnchor; + pOutput->pNext != NULL; + pOutput = pOutput->pNext) + ; /* EMPTY */ + fail(pOutput == NULL); + } + usChar = usNextChar(pFile, hdrftr_list, + &ulFileOffset, &ulCharPos, NULL); + } + vCloseFont(); + if (bOutputContainsText(pAnchor)) { + return pAnchor; + } + pAnchor = pStartNewOutput(pAnchor, NULL); + pAnchor->szStorage = xfree(pAnchor->szStorage); + pAnchor = xfree(pAnchor); + return NULL; + } /* end of pHdrFtrDecryptor */ + + /* + * pFootnoteDecryptor - turn a footnote text list element into text + */ + char * + szFootnoteDecryptor(FILE *pFile, ULONG ulCharPosStart, ULONG ulCharPosNext) + { + char *szText; + ULONG ulChar, ulFileOffset, ulCharPos; + USHORT usChar; + size_t tLen, tIndex, tNextFree, tStorageSize; + char szResult[6]; + BOOL bSkip; + + fail(iWordVersion < 0); + fail(tOptions.eConversionType == conversion_unknown); + fail(tOptions.eEncoding == 0); + + if (ulCharPosStart == ulCharPosNext) { + /* There are no bytes to decrypt */ + return NULL; + } + + if (tOptions.eConversionType != conversion_xml) { + /* Only implemented for XML output */ + return NULL; + } + + bSkip = FALSE; + + /* Initialise the text buffer */ + tStorageSize = INITIAL_SIZE; + szText = xmalloc(tStorageSize); + tNextFree = 0; + szText[tNextFree] = '\0'; + + /* Goto the start */ + usChar = usToFootnotePosition(pFile, ulCharPosStart); + ulCharPos = ulCharPosStart; + ulFileOffset = ulCharPos2FileOffset(ulCharPos); + /* Skip the unwanted starting characters */ + while (usChar != (USHORT)EOF && ulCharPos != ulCharPosNext && + (usChar == FOOTNOTE_OR_ENDNOTE || + usChar == PAR_END || + usChar == TAB || + usChar == (USHORT)' ')) { + usChar = usNextChar(pFile, footnote_list, + &ulFileOffset, &ulCharPos, NULL); + } + /* Process the footnote text */ + while (usChar != (USHORT)EOF && ulCharPos != ulCharPosNext) { + /* Skip embedded characters */ + if (usChar == START_EMBEDDED) { + bSkip = TRUE; + } else if (usChar == END_IGNORE || usChar == END_EMBEDDED) { + bSkip = FALSE; + } + /* Translate character */ + if (bSkip || + usChar == END_IGNORE || + usChar == END_EMBEDDED || + usChar == FOOTNOTE_OR_ENDNOTE) { + ulChar = IGNORE_CHARACTER; + } else { + ulChar = ulTranslateCharacters(usChar, + ulFileOffset, + iWordVersion, + tOptions.eConversionType, + tOptions.eEncoding, + bOldMacFile); + } + /* Process character */ + if (ulChar == PICTURE) { + tLen = 5; + strcpy(szResult, "[pic]"); + } else if (ulChar == IGNORE_CHARACTER) { + tLen = 0; + szResult[0] = '\0'; + } else { + switch (ulChar) { + case PAR_END: + case HARD_RETURN: + case PAGE_BREAK: + case COLUMN_FEED: + ulChar = (ULONG)PAR_END; + break; + case TAB: + ulChar = (ULONG)' '; + break; + default: + break; + } + tLen = tUcs2Utf8(ulChar, szResult, sizeof(szResult)); + } + /* Add the results to the text */ + if (tNextFree + tLen + 1 > tStorageSize) { + tStorageSize += EXTENTION_SIZE; + szText = xrealloc(szText, tStorageSize); + } + for (tIndex = 0; tIndex < tLen; tIndex++) { + szText[tNextFree++] = szResult[tIndex]; + } + szText[tNextFree] = '\0'; + /* Next character */ + usChar = usNextChar(pFile, footnote_list, + &ulFileOffset, &ulCharPos, NULL); + } + /* Remove redundant spaces */ + while (tNextFree != 0 && szText[tNextFree - 1] == ' ') { + szText[tNextFree - 1] = '\0'; + tNextFree--; + } + if (tNextFree == 0) { + /* No text */ + szText = xfree(szText); + return NULL; + } + return szText; + } /* end of szFootnoteDecryptor */ [jmk] --rw-rw-r-- M 499692 jmk sys 39070 Jan 14 12:57 sys/src/cmd/aux/antiword/word2text.c [jmk] --rw-rw-r-- M 499692 jmk sys 11743 Jan 14 12:57 sys/src/cmd/aux/antiword/wordconst.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:1,6 /* * wordconst.h - * Copyright (C) 1998-2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Constants and macros for the interpretation of MS Word files /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:79,85 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:79,89 #define LIST_UPPER_ALPHA 0x03 #define LIST_LOWER_ALPHA 0x04 #define LIST_ORDINAL_NUM 0x05 + #define LIST_NUMBER_TXT 0x06 + #define LIST_ORDINAL_TXT 0x07 + #define LIST_OUTLINE_NUM 0x16 #define LIST_SPECIAL 0x17 + #define LIST_SPECIAL2 0x19 #define LIST_BULLETS 0xff /* Types of paragraph alignment */ #define ALIGNMENT_LEFT 0x00 /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:188,194 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:192,202 #define WORD_SOFT_HYPHEN 0x1f /* Unicode characters */ - #define UNICODE_COPYRIGHT_SIGN 0x00a9 + #define UNICODE_DOUBLE_LEFT_ANGLE_QMARK 0x00ab + #define UNICODE_MIDDLE_DOT 0x00b7 + #define UNICODE_DOUBLE_RIGHT_ANGLE_QMARK 0x00bb + #define UNICODE_CAPITAL_D_WITH_STROKE 0x0110 + #define UNICODE_SMALL_D_WITH_STROKE 0x0111 #define UNICODE_CAPITAL_LIGATURE_OE 0x0152 #define UNICODE_SMALL_LIGATURE_OE 0x0153 #define UNICODE_SMALL_F_HOOK 0x0192 /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:234,246 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:242,258 #define UNICODE_BULLET 0x2022 #define UNICODE_TRIANGULAR_BULLET 0x2023 #define UNICODE_ONE_DOT_LEADER 0x2024 + #define UNICODE_TWO_DOT_LEADER 0x2025 #define UNICODE_ELLIPSIS 0x2026 #define UNICODE_HYPHENATION_POINT 0x2027 #define UNICODE_LEFT_TO_RIGHT_EMBEDDING 0x202a #define UNICODE_RIGHT_TO_LEFT_EMBEDDING 0x202b + #define UNICODE_POP_DIRECTIONAL_FORMATTING 0x202c + #define UNICODE_LEFT_TO_RIGHT_OVERRIDE 0x202d + #define UNICODE_RIGHT_TO_LEFT_OVERRIDE 0x202e + #define UNICODE_NARROW_NO_BREAK_SPACE 0x202f #define UNICODE_PER_MILLE_SIGN 0x2030 #define UNICODE_PRIME 0x2032 - #define UNICODE_PRIME 0x2032 #define UNICODE_DOUBLE_PRIME 0x2033 #define UNICODE_SINGLE_LEFT_ANGLE_QMARK 0x2039 #define UNICODE_SINGLE_RIGHT_ANGLE_QMARK 0x203a /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:250,255 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:262,268 #define UNICODE_CIRCLE 0x20dd #define UNICODE_SQUARE 0x20de #define UNICODE_DIAMOND 0x20df + #define UNICODE_NUMERO_SIGN 0x2116 #define UNICODE_TRADEMARK_SIGN 0x2122 #define UNICODE_KELVIN_SIGN 0x212a #define UNICODE_LEFTWARDS_ARROW 0x2190 /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:260,265 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:273,279 #define UNICODE_MINUS_SIGN 0x2212 #define UNICODE_DIVISION_SLASH 0x2215 #define UNICODE_ASTERISK_OPERATOR 0x2217 + #define UNICODE_BULLET_OPERATOR 0x2219 #define UNICODE_RATIO 0x2236 #define UNICODE_TILDE_OPERATOR 0x223c #define UNICODE_BD_LIGHT_HORIZONTAL 0x2500 /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordconst.h:291,307 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordconst.h:305,318 #define UNICODE_BLACK_CLUB_SUIT 0x2663 #define UNICODE_SMALL_LIGATURE_FI 0xfb01 #define UNICODE_SMALL_LIGATURE_FL 0xfb02 + #define UNICODE_ZERO_WIDTH_NO_BREAK_SPACE 0xfeff #if defined(__riscos) #define OUR_ELLIPSIS 0x8c - #define OUR_BULLET_TEXT 0x8f - #define OUR_BULLET_PS 0x8f #define OUR_EM_DASH 0x98 #define OUR_UNBREAKABLE_JOIN 0x99 #else #define OUR_ELLIPSIS '.' - #define OUR_BULLET_TEXT '.' - #define OUR_BULLET_PS '\217' #define OUR_EM_DASH '-' #define OUR_UNBREAKABLE_JOIN '-' #endif /* __riscos */ [jmk] --rw-rw-r-- M 499692 jmk sys 11743 Jan 14 12:57 sys/src/cmd/aux/antiword/wordconst.h [jmk] --rw-rw-r-- M 499692 jmk sys 2790 Jan 14 12:57 sys/src/cmd/aux/antiword/worddos.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/worddos.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/worddos.c:1,6 /* * worddos.c - * Copyright (C) 2002 A.J. van Os; Released under GPL + * Copyright (C) 2002-2005 A.J. van Os; Released under GNU GPL * * Description: * Deal with the DOS internals of a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/worddos.c:96,105 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/worddos.c:96,108 } bSuccess = bGetDocumentText(pFile, lFilesize, aucHeader); if (bSuccess) { + vGetPropertyInfo(pFile, NULL, + NULL, 0, NULL, 0, + aucHeader, iWordVersion); vSetDefaultTabWidth(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); - vGetPropertyInfo(pFile, NULL, + vGetNotesInfo(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); } [jmk] --rw-rw-r-- M 499692 jmk sys 2790 Jan 14 12:57 sys/src/cmd/aux/antiword/worddos.c [jmk] --rw-rw-r-- M 499692 jmk sys 7910 Jan 14 12:57 sys/src/cmd/aux/antiword/wordlib.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordlib.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordlib.c:1,6 /* * wordlib.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Deal with the internals of a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordlib.c:349,355 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordlib.c:349,357 vDestroyFontInfoList(); vDestroyStylesheetList(); vDestroyPictInfoList(); + vDestroyDocumentInfoList(); vDestroySectionInfoList(); + vDestroyHdrFtrInfoList(); vDestroyPropModList(); vDestroyNotesInfoLists(); vDestroyFontTable(); [jmk] --rw-rw-r-- M 499692 jmk sys 7910 Jan 14 12:57 sys/src/cmd/aux/antiword/wordlib.c [jmk] --rw-rw-r-- M 499692 jmk sys 2658 Jan 14 12:57 sys/src/cmd/aux/antiword/wordmac.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordmac.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordmac.c:1,6 /* * wordmac.c - * Copyright (C) 2002 A.J. van Os; Released under GPL + * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL * * Description: * Deal with the MAC internals of a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordmac.c:20,25 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordmac.c:20,27 text_block_type tTextBlock; ULONG ulBeginOfText, ulEndOfText; ULONG ulTextLen; + UCHAR ucDocStatus; + BOOL bFastSaved; fail(pFile == NULL); fail(aucHeader == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordmac.c:26,31 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordmac.c:28,45 DBG_MSG("bGetDocumentText"); + NO_DBG_PRINT_BLOCK(aucHeader, 0x20); + + /* Get the status flags from the header */ + ucDocStatus = ucGetByte(0x0a, aucHeader); + DBG_HEX(ucDocStatus); + bFastSaved = (ucDocStatus & BIT(5)) != 0; + DBG_MSG_C(bFastSaved, "This document is Fast Saved"); + if (bFastSaved) { + werr(0, "MacWord: fast saved documents are not supported yet"); + return FALSE; + } + /* Get length information */ ulBeginOfText = ulGetLongBE(0x14, aucHeader); DBG_HEX(ulBeginOfText); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordmac.c:83,92 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordmac.c:97,106 } bSuccess = bGetDocumentText(pFile, aucHeader); if (bSuccess) { - vSetDefaultTabWidth(pFile, NULL, + vGetPropertyInfo(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); - vGetPropertyInfo(pFile, NULL, + vSetDefaultTabWidth(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); } [jmk] --rw-rw-r-- M 499692 jmk sys 2658 Jan 14 12:57 sys/src/cmd/aux/antiword/wordmac.c [jmk] --rw-rw-r-- M 499692 jmk sys 22402 Jan 14 12:57 sys/src/cmd/aux/antiword/wordole.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordole.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordole.c:1,6 /* * wordole.c - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GPL * * Description: * Deal with the OLE internals of a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordole.c:557,562 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordole.c:557,563 if (!bHasImages || tOptions.eConversionType == conversion_text || + tOptions.eConversionType == conversion_fmt_text || tOptions.eConversionType == conversion_xml || tOptions.eImageLevel == level_no_images) { /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordole.c:629,635 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordole.c:630,636 size_t tBBDLen, tSBDLen, tNumBbdBlocks, tRootListLen; int iWordVersion, iIndex, iToGo; BOOL bSuccess; - USHORT usIdent; + USHORT usIdent, usDocStatus; UCHAR aucHeader[HEADER_SIZE]; fail(pFile == NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordole.c:771,776 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordole.c:772,788 return -1; } + /* Get the status flags from the header */ + usDocStatus = usGetWord(0x0a, aucHeader); + if (usDocStatus & BIT(9)) { + PPS_info.tTable = PPS_info.t1Table; + } else { + PPS_info.tTable = PPS_info.t0Table; + } + /* Clean the entries that should not be used */ + memset(&PPS_info.t0Table, 0, sizeof(PPS_info.t0Table)); + memset(&PPS_info.t1Table, 0, sizeof(PPS_info.t1Table)); + bSuccess = bGetDocumentText(pFile, &PPS_info, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader, iWordVersion); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordole.c:777,786 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordole.c:789,798 if (bSuccess) { vGetDocumentData(pFile, &PPS_info, aulBBD, tBBDLen, aucHeader, iWordVersion); - vSetDefaultTabWidth(pFile, &PPS_info, + vGetPropertyInfo(pFile, &PPS_info, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader, iWordVersion); - vGetPropertyInfo(pFile, &PPS_info, + vSetDefaultTabWidth(pFile, &PPS_info, aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader, iWordVersion); vGetNotesInfo(pFile, &PPS_info, [jmk] --rw-rw-r-- M 499692 jmk sys 22402 Jan 14 12:57 sys/src/cmd/aux/antiword/wordole.c [jmk] --rw-rw-r-- M 499692 jmk sys 8285 Jan 14 12:57 sys/src/cmd/aux/antiword/wordtypes.h /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:1,6 /* * wordtypes.h - * Copyright (C) 1998-2003 A.J. van Os; Released under GPL + * Copyright (C) 1998-2004 A.J. van Os; Released under GPL * * Description: * Typedefs for the interpretation of MS Word files /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:9,14 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:9,20 #if !defined(__wordtypes_h) #define __wordtypes_h 1 + #include + #if defined(__riscos) + #include "DeskLib:Font.h" + #include "DeskLib:Wimp.h" + #endif /* __riscos */ + typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned int UINT; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:16,24 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:22,31 #if defined(__riscos) typedef struct diagram_tag { - draw_diag tInfo; - wimp_w tMainWindow; - wimp_w tScaleWindow; + drawfile_info tInfo; + window_handle tMainWindow; + window_handle tScaleWindow; + menu_ptr pSaveMenu; long lXleft; /* In DrawUnits */ long lYtop; /* In DrawUnits */ size_t tMemorySize; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:32,42 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:39,49 long lXleft; /* In DrawUnits */ long lYtop; /* In DrawUnits */ } diagram_type; - typedef UCHAR draw_fontref; + typedef UCHAR drawfile_fontref; #endif /* __riscos */ typedef struct output_tag { - char *szStorage; + char *szStorage; long lStringWidth; /* In millipoints */ size_t tStorageSize; size_t tNextFree; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:43,49 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:50,56 USHORT usFontStyle; USHORT usFontSize; UCHAR ucFontColor; - draw_fontref tFontRef; + drawfile_fontref tFontRef; struct output_tag *pPrev; struct output_tag *pNext; } output_type; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:54,68 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:61,78 conversion_text, conversion_draw, conversion_ps, - conversion_xml + conversion_xml, + conversion_pdf, + conversion_fmt_text } conversion_type; /* Types of encoding */ typedef enum encoding_tag { encoding_neutral = 100, - encoding_iso_8859_1 = 801, - encoding_iso_8859_2 = 802, - encoding_utf8 = 1601 + encoding_latin_1 = 801, + encoding_latin_2 = 802, + encoding_cyrillic = 805, + encoding_utf_8 = 1601 } encoding_type; /* Font translation table entry */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:69,74 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:79,86 typedef struct font_table_tag { USHORT usFontStyle; UCHAR ucWordFontNumber; + UCHAR ucFFN; + UCHAR ucEmphasis; UCHAR ucInUse; char szWordFontname[65]; char szOurFontname[33]; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:87,92 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:99,105 int iParagraphBreak; conversion_type eConversionType; BOOL bHideHiddenText; + BOOL bRemoveRemovedText; BOOL bUseLandscape; encoding_type eEncoding; int iPageHeight; /* In points */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:106,115 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:119,129 typedef struct pps_info_tag { pps_type tWordDocument; /* Text stream */ pps_type tData; /* Data stream */ - pps_type t0Table; /* Table 0 stream */ - pps_type t1Table; /* Table 1 stream */ + pps_type tTable; /* Table stream */ pps_type tSummaryInfo; /* Summary Information */ pps_type tDocSummaryInfo;/* Document Summary Information */ + pps_type t0Table; /* Table 0 stream */ + pps_type t1Table; /* Table 1 stream */ } pps_info_type; /* Record of data block information */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:128,133 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:142,155 USHORT usPropMod; } text_block_type; + /* Record of the document block information */ + typedef struct document_block_tag { + time_t tCreateDate; /* Unix timestamp */ + time_t tRevisedDate; /* Unix timestamp */ + USHORT usDefaultTabWidth; /* In twips */ + UCHAR ucHdrFtrSpecification; + } document_block_type; + /* Record of table-row block information */ typedef struct row_block_tag { ULONG ulFileOffsetStart; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:134,140 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:156,161 ULONG ulFileOffsetEnd; ULONG ulCharPosStart; ULONG ulCharPosEnd; - int iColumnWidthSum; /* In twips */ short asColumnWidth[TABLE_COLUMN_MAX+1]; /* In twips */ UCHAR ucNumberOfColumns; UCHAR ucBorderInfo; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:149,157 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:170,192 level_type_pause } level_type_enum; + typedef enum list_id_tag { + no_list = 0, + text_list, + footnote_list, + hdrftr_list, + macro_list, + annotation_list, + endnote_list, + textbox_list, + hdrtextbox_list, + end_of_lists + } list_id_enum; + /* Linked list of style description information */ typedef struct style_block_tag { - ULONG ulFileOffset; + ULONG ulFileOffset; /* The style start with this character */ + list_id_enum eListID;/* The fileoffset is in this list */ BOOL bNumPause; BOOL bNoRestart; /* Don't restart by more significant levels */ USHORT usIstd; /* Current style */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:171,177 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:206,212 char szListChar[4]; /* Character for an itemized list */ } style_block_type; - /* Linked list of font description information */ + /* Font description information */ typedef struct font_block_tag { ULONG ulFileOffset; USHORT usFontStyle; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:179,208 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:214,247 UCHAR ucFontNumber; UCHAR ucFontColor; } font_block_type; - typedef struct font_desc_tag { - font_block_type tInfo; - struct font_desc_tag *pNext; - } font_desc_type; - /* Linked list of picture description information */ + /* Picture description information */ typedef struct picture_block_tag { ULONG ulFileOffset; ULONG ulFileOffsetPicture; ULONG ulPictureOffset; } picture_block_type; - typedef struct picture_desc_tag { - picture_block_type tInfo; - struct picture_desc_tag *pNext; - } picture_desc_type; /* Section description information */ typedef struct section_block_tag { BOOL bNewPage; - UCHAR aucNFC[9]; /* Number format code */ USHORT usNeedPrevLvl; /* Print previous level numbers */ USHORT usHangingIndent; + UCHAR aucNFC[9]; /* Number format code */ + UCHAR ucHdrFtrSpecification; /* Which headers/footers Word < 8 */ } section_block_type; + /* Header/footer description information */ + typedef struct hdrftr_block_tag { + output_type *pText; + long lHeight; /* In DrawUnits */ + } hdrftr_block_type; + + /* Footnote description information */ + typedef struct footnote_block_tag { + char *szText; + } footnote_block_type; + /* List description information */ typedef struct list_block_tag { ULONG ulStartAt; /* Number at the start of a list */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordtypes.h:262,276 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordtypes.h:301,306 found_end_of_row, found_not_end_of_row } row_info_enum; - - typedef enum list_id_tag { - text_list, - footnote_list, - endnote_list, - textbox_list, - hdrtextbox_list, - end_of_lists - } list_id_enum; typedef enum notetype_tag { notetype_is_footnote, [jmk] --rw-rw-r-- M 499692 jmk sys 8285 Jan 14 12:57 sys/src/cmd/aux/antiword/wordtypes.h [jmk] --rw-rw-r-- M 499692 jmk sys 5584 Jan 14 12:57 sys/src/cmd/aux/antiword/wordwin.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordwin.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordwin.c:1,6 /* * wordwin.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GPL + * Copyright (C) 2002-2005 A.J. van Os; Released under GPL * * Description: * Deal with the WIN internals of a MS Word file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordwin.c:121,126 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordwin.c:121,127 if (!bHasImages || tOptions.eConversionType == conversion_text || + tOptions.eConversionType == conversion_fmt_text || tOptions.eConversionType == conversion_xml || tOptions.eImageLevel == level_no_images) { /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/wordwin.c:194,203 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/wordwin.c:195,207 bSuccess = bGetDocumentText(pFile, aucHeader); if (bSuccess) { vGetDocumentData(pFile, aucHeader); + vGetPropertyInfo(pFile, NULL, + NULL, 0, NULL, 0, + aucHeader, iWordVersion); vSetDefaultTabWidth(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); - vGetPropertyInfo(pFile, NULL, + vGetNotesInfo(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); } [jmk] --rw-rw-r-- M 499692 jmk sys 5584 Jan 14 12:57 sys/src/cmd/aux/antiword/wordwin.c [jmk] --rw-rw-r-- M 499692 jmk sys 2501 Jan 14 12:57 sys/src/cmd/aux/antiword/xmalloc.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:1,6 /* * xmalloc.c - * Copyright (C) 1998-2003 A.J. van Os + * Copyright (C) 1998-2005 A.J. van Os * * Description: * Extended malloc and friends /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:10,22 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:10,21 #include #include "antiword.h" - #if !defined(DMALLOC) - static char *szWarning = + static char *szMessage = "Memory allocation failed, unable to continue"; - #if defined(__dos) - static char *szDosWarning = + #if defined(__dos) && !defined(__DJGPP__) + static char *szDosMessage = "DOS can't allocate this kind of memory, unable to continue"; - #endif /* __dos */ + #endif /* __dos && !__DJGPP__ */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:30,41 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:29,44 { void *pvTmp; + TRACE_MSG("xmalloc"); + if (tSize == 0) { tSize = 1; } pvTmp = malloc(tSize); if (pvTmp == NULL) { - werr(1, szWarning); + DBG_MSG("xmalloc returned NULL"); + DBG_DEC(tSize); + werr(1, szMessage); } return pvTmp; } /* end of xmalloc */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:50,60 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:53,66 { void *pvTmp; - #if defined(__dos) + TRACE_MSG("xcalloc"); + + #if defined(__dos) && !defined(__DJGPP__) if ((ULONG)tNmemb * (ULONG)tSize > 0xffffUL) { - werr(1, szDosWarning); + DBG_DEC((ULONG)tNmemb * (ULONG)tSize); + werr(1, szDosMessage); } - #endif /* __dos */ + #endif /* __dos && !__DJGPP__ */ if (tNmemb == 0 || tSize == 0) { tNmemb = 1; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:62,68 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:68,75 } pvTmp = calloc(tNmemb, tSize); if (pvTmp == NULL) { - werr(1, szWarning); + DBG_MSG("xcalloc returned NULL"); + werr(1, szMessage); } return pvTmp; } /* end of xcalloc */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:78,86 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:85,96 { void *pvTmp; + TRACE_MSG("xrealloc"); + pvTmp = realloc(pvArg, tSize); if (pvTmp == NULL) { - werr(1, szWarning); + DBG_MSG("realloc returned NULL"); + werr(1, szMessage); } return pvTmp; } /* end of xrealloc */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:99,109 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:109,120 { char *szTmp; + TRACE_MSG("xstrdup"); + szTmp = xmalloc(strlen(szArg) + 1); strcpy(szTmp, szArg); return szTmp; } /* end of xstrdup */ - #endif /* !DMALLOC */ /* * xfree - Deallocates dynamic memory /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xmalloc.c:116,121 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xmalloc.c:127,134 void * xfree(void *pvArg) { + TRACE_MSG("xfree"); + if (pvArg != NULL) { free(pvArg); } [jmk] --rw-rw-r-- M 499692 jmk sys 2501 Jan 14 12:57 sys/src/cmd/aux/antiword/xmalloc.c [jmk] --rw-rw-r-- M 499692 jmk sys 34115 Jan 14 12:57 sys/src/cmd/aux/antiword/xml.c /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:1,6 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1,6 /* * xml.c - * Copyright (C) 2002,2003 A.J. van Os; Released under GNU GPL + * Copyright (C) 2002-2005 A.J. van Os; Released under GNU GPL * * Description: * Functions to deal with the XML/DocBook format /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:19,24 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:19,30 #define vStackTrace() /* EMPTY */ #endif /* DEBUG */ + /* The character set */ + static encoding_type eEncoding = encoding_neutral; + /* Word version */ + static int iWordVersion = -1; + /* Special treatment for files from Word 4/5/6 on an Apple Macintosh */ + static BOOL bOldMacFile = FALSE; /* Text is emphasised */ static BOOL bEmphasisOpen = FALSE; /* Text is superscript */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:29,34 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:35,42 static BOOL bTitleOpen = FALSE; /* Table is open */ static BOOL bTableOpen = FALSE; + /* Footnote is open */ + static BOOL bFootnoteOpen = FALSE; /* Current paragraph level */ static UINT uiParagraphLevel = 0; /* Current list level */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:41,46 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:49,56 static BOOL bEmptyHeaderLevel = TRUE; /* Number of columns in the current table */ static int iTableColumnsCurrent = 0; + /* Footnote number */ + static UINT uiFootnoteNumber = 0; /* Constants for the stack */ #define INITIAL_STACK_SIZE 10 /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:68,132 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:78,150 #define TAG_EMPHASIS (UCHAR)9 #define TAG_ENTRY (UCHAR)10 #define TAG_FILENAME (UCHAR)11 - #define TAG_INFORMALTABLE (UCHAR)12 - #define TAG_ITEMIZEDLIST (UCHAR)13 - #define TAG_LISTITEM (UCHAR)14 - #define TAG_ORDEREDLIST (UCHAR)15 - #define TAG_PARA (UCHAR)16 - #define TAG_ROW (UCHAR)17 - #define TAG_SECT1 (UCHAR)18 - #define TAG_SECT2 (UCHAR)19 - #define TAG_SECT3 (UCHAR)20 - #define TAG_SECT4 (UCHAR)21 - #define TAG_SECT5 (UCHAR)22 - #define TAG_SUBSCRIPT (UCHAR)23 - #define TAG_SUBTITLE (UCHAR)24 - #define TAG_SUPERSCRIPT (UCHAR)25 - #define TAG_SURNAME (UCHAR)26 - #define TAG_TBODY (UCHAR)27 - #define TAG_TGROUP (UCHAR)28 - #define TAG_TITLE (UCHAR)29 + #define TAG_FOOTNOTE (UCHAR)12 + #define TAG_INFORMALTABLE (UCHAR)13 + #define TAG_ITEMIZEDLIST (UCHAR)14 + #define TAG_LISTITEM (UCHAR)15 + #define TAG_ORDEREDLIST (UCHAR)16 + #define TAG_PARA (UCHAR)17 + #define TAG_ROW (UCHAR)18 + #define TAG_SECT1 (UCHAR)19 + #define TAG_SECT2 (UCHAR)20 + #define TAG_SECT3 (UCHAR)21 + #define TAG_SECT4 (UCHAR)22 + #define TAG_SECT5 (UCHAR)23 + #define TAG_SUBSCRIPT (UCHAR)24 + #define TAG_SUBTITLE (UCHAR)25 + #define TAG_SUPERSCRIPT (UCHAR)26 + #define TAG_SURNAME (UCHAR)27 + #define TAG_TBODY (UCHAR)28 + #define TAG_TGROUP (UCHAR)29 + #define TAG_TITLE (UCHAR)30 typedef struct docbooktags_tag { UCHAR ucTagnumber; char szTagname[15]; - BOOL bAddNewline; + BOOL bAddNewlineStart; + BOOL bAddNewlineEnd; } docbooktags_type; static const docbooktags_type atDocBookTags[] = { - { TAG_NOTAG, "!ERROR!", TRUE }, - { TAG_AUTHOR, "author", TRUE }, - { TAG_BEGINPAGE, "beginpage", TRUE }, - { TAG_BOOK, "book", TRUE }, - { TAG_BOOKINFO, "bookinfo", TRUE }, - { TAG_CHAPTER, "chapter", TRUE }, - { TAG_COLSPEC, "colspec", TRUE }, - { TAG_CORPNAME, "corpname", FALSE }, - { TAG_DATE, "date", FALSE }, - { TAG_EMPHASIS, "emphasis", FALSE }, - { TAG_ENTRY, "entry", TRUE }, - { TAG_FILENAME, "filename", FALSE }, - { TAG_INFORMALTABLE, "informaltable",TRUE }, - { TAG_ITEMIZEDLIST, "itemizedlist", TRUE }, - { TAG_LISTITEM, "listitem", TRUE }, - { TAG_ORDEREDLIST, "orderedlist", TRUE }, - { TAG_PARA, "para", TRUE }, - { TAG_ROW, "row", TRUE }, - { TAG_SECT1, "sect1", TRUE }, - { TAG_SECT2, "sect2", TRUE }, - { TAG_SECT3, "sect3", TRUE }, - { TAG_SECT4, "sect4", TRUE }, - { TAG_SECT5, "sect5", TRUE }, - { TAG_SUBSCRIPT, "subscript", FALSE }, - { TAG_SUBTITLE, "subtitle", FALSE }, - { TAG_SUPERSCRIPT, "superscript", FALSE }, - { TAG_SURNAME, "surname", FALSE }, - { TAG_TBODY, "tbody", TRUE }, - { TAG_TGROUP, "tgroup", TRUE }, - { TAG_TITLE, "title", FALSE }, + { TAG_NOTAG, "!ERROR!", TRUE, TRUE }, + { TAG_AUTHOR, "author", TRUE, TRUE }, + { TAG_BEGINPAGE, "beginpage", TRUE, TRUE }, + { TAG_BOOK, "book", TRUE, TRUE }, + { TAG_BOOKINFO, "bookinfo", TRUE, TRUE }, + { TAG_CHAPTER, "chapter", TRUE, TRUE }, + { TAG_COLSPEC, "colspec", TRUE, TRUE }, + { TAG_CORPNAME, "corpname", FALSE, FALSE }, + { TAG_DATE, "date", FALSE, FALSE }, + { TAG_EMPHASIS, "emphasis", FALSE, FALSE }, + { TAG_ENTRY, "entry", TRUE, TRUE }, + { TAG_FILENAME, "filename", FALSE, FALSE }, + { TAG_FOOTNOTE, "footnote", FALSE, FALSE }, + { TAG_INFORMALTABLE, "informaltable",TRUE, TRUE }, + { TAG_ITEMIZEDLIST, "itemizedlist", TRUE, TRUE }, + { TAG_LISTITEM, "listitem", TRUE, TRUE }, + { TAG_ORDEREDLIST, "orderedlist", TRUE, TRUE }, + { TAG_PARA, "para", TRUE, TRUE }, + { TAG_ROW, "row", TRUE, TRUE }, + { TAG_SECT1, "sect1", TRUE, TRUE }, + { TAG_SECT2, "sect2", TRUE, TRUE }, + { TAG_SECT3, "sect3", TRUE, TRUE }, + { TAG_SECT4, "sect4", TRUE, TRUE }, + { TAG_SECT5, "sect5", TRUE, TRUE }, + { TAG_SUBSCRIPT, "subscript", FALSE, FALSE }, + { TAG_SUBTITLE, "subtitle", FALSE, FALSE }, + { TAG_SUPERSCRIPT, "superscript", FALSE, FALSE }, + { TAG_SURNAME, "surname", FALSE, FALSE }, + { TAG_TBODY, "tbody", TRUE, TRUE }, + { TAG_TGROUP, "tgroup", TRUE, TRUE }, + { TAG_TITLE, "title", FALSE, FALSE }, }; + static void vAddStartTag(diagram_type *, UCHAR, const char *); + static void vAddEndTag(diagram_type *, UCHAR); + static void vAddCombinedTag(diagram_type *, UCHAR, const char *); + static void vPrintChar(diagram_type *, char); + #if defined(DEBUG) /* * vCheckTagTable - check the tag table /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:238,297 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:256,386 } /* end of vPrintLevel */ /* + * vPrintFootnote - print a footnote + */ + static void + vPrintFootnote(diagram_type *pDiag, UINT uiFootnoteIndex) + { + const char *szText, *pcTmp; + BOOL bSuScript; + UCHAR ucTopTag; + + TRACE_MSG("vPrintFootnote"); + + szText = szGetFootnootText(uiFootnoteIndex); + + if (szText == NULL) { + szText = ""; + } + + /* Remove the subscript/superscript (if any) */ + ucTopTag = ucReadStack(); + bSuScript = ucTopTag == TAG_SUBSCRIPT || ucTopTag == TAG_SUPERSCRIPT; + if (bSuScript) { + vAddEndTag(pDiag, ucTopTag); + } + + /* Start a footnote */ + vAddStartTag(pDiag, TAG_FOOTNOTE, NULL); + vAddStartTag(pDiag, TAG_PARA, NULL); + + /* Print a footnote */ + for (pcTmp = szText; *pcTmp != '\0'; pcTmp++) { + if (*pcTmp == PAR_END) { + if (*(pcTmp + 1) != PAR_END && *(pcTmp + 1) != '\0') { + /* PAR_END is not empty and not last */ + vAddEndTag(pDiag, TAG_PARA); + vAddStartTag(pDiag, TAG_PARA, NULL); + } + } else { + vPrintChar(pDiag, *pcTmp); + } + } + + /* End a footnote */ + vAddEndTag(pDiag, TAG_PARA); + vAddEndTag(pDiag, TAG_FOOTNOTE); + + /* Repair the subscript/superscript (if any) */ + if (bSuScript) { + vAddStartTag(pDiag, ucTopTag, NULL); + } + } /* end of vPrintFootnote */ + + /* * vPrintChar - print a character with XML encoding */ static void - vPrintChar(FILE *pOutFile, char cChar) + vPrintChar(diagram_type *pDiag, char cChar) { + fail(pDiag == NULL); + fail(pDiag->pOutFile == NULL); + switch (cChar) { + case FOOTNOTE_OR_ENDNOTE: + uiFootnoteNumber++; + vPrintFootnote(pDiag, uiFootnoteNumber - 1); + break; case '<': - fprintf(pOutFile, "%s", "<"); + fprintf(pDiag->pOutFile, "%s", "<"); break; case '>': - fprintf(pOutFile, "%s", ">"); + fprintf(pDiag->pOutFile, "%s", ">"); break; case '&': - fprintf(pOutFile, "%s", "&"); + fprintf(pDiag->pOutFile, "%s", "&"); break; default: - (void)putc(cChar, pOutFile); + (void)putc(cChar, pDiag->pOutFile); break; } } /* end of vPrintChar */ /* - * vPrintSpecial + * vPrintSpecialChar - convert and print a character */ static void - vPrintSpecial(FILE *pOutFile, const char *szString, - int iWordVersion, encoding_type eEncoding) + vPrintSpecialChar(diagram_type *pDiag, USHORT usChar) { - ULONG ulChar; - size_t tLen, tIndex; + ULONG ulChar; + size_t tLen, tIndex; + char szResult[4]; + + fail(pDiag == NULL); + fail(pDiag->pOutFile == NULL); + fail(iWordVersion < 0); + fail(eEncoding == encoding_neutral); + + ulChar = ulTranslateCharacters(usChar, 0, iWordVersion, + conversion_xml, eEncoding, bOldMacFile); + tLen = tUcs2Utf8(ulChar, szResult, sizeof(szResult)); + if (tLen == 1) { + vPrintChar(pDiag, szResult[0]); + } else { + for (tIndex = 0; tIndex < tLen; tIndex++) { + (void)putc(szResult[tIndex], pDiag->pOutFile); + } + } + } /* end of vPrintSpecialChar */ + + /* + * vPrintSpecialString - convert and print a string + */ + static void + vPrintSpecialString(diagram_type *pDiag, const char *szString) + { int iIndex; - BOOL bOldMacFile; USHORT usChar; - char szResult[4]; - fail(pOutFile == NULL); + fail(pDiag == NULL); + fail(pDiag->pOutFile == NULL); fail(szString == NULL); - bOldMacFile = bIsOldMacFile(); - for (iIndex = 0; szString[iIndex] != '\0'; iIndex++) { usChar = (USHORT)(UCHAR)szString[iIndex]; - ulChar = ulTranslateCharacters(usChar, 0, iWordVersion, - conversion_xml, eEncoding, bOldMacFile); - tLen = tUcs2Utf8(ulChar, szResult, sizeof(szResult)); - if (tLen == 1) { - vPrintChar(pOutFile, szResult[0]); - } else { - for (tIndex = 0; tIndex < tLen; tIndex++) { - (void)putc(szResult[tIndex], pOutFile); - } - } + vPrintSpecialChar(pDiag, usChar); } - } /* end of vPrintSpecial */ + } /* end of vPrintSpecialString */ /* * vAddStartTag - add the specified start tag to the file /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:303,309 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:392,398 fail(pDiag->pOutFile == NULL); fail((size_t)ucTag >= elementsof(atDocBookTags)); - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); vPrintLevel(pDiag->pOutFile); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:316,322 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:405,411 atDocBookTags[(UINT)ucTag].szTagname, szAttribute); } - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineEnd) { fprintf(pDiag->pOutFile, "\n"); pDiag->lXleft = 0; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:353,360 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:442,452 fail(uiParagraphLevel != 0); bTitleOpen = TRUE; break; + case TAG_FOOTNOTE: + bFootnoteOpen = TRUE; + break; case TAG_PARA: - fail(bTitleOpen); + fail(bTitleOpen && !bFootnoteOpen); uiParagraphLevel++; bEmptyHeaderLevel = FALSE; break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:415,421 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:507,513 werr(1, "Impossible tag sequence, unable to continue"); } - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineEnd) { fprintf(pDiag->pOutFile, "\n"); vPrintLevel(pDiag->pOutFile); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:422,428 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:514,520 fprintf(pDiag->pOutFile, "", atDocBookTags[(UINT)ucTag].szTagname); - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); pDiag->lXleft = 0; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:450,455 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:542,550 case TAG_TITLE: bTitleOpen = FALSE; break; + case TAG_FOOTNOTE: + bFootnoteOpen = FALSE; + break; case TAG_PARA: uiParagraphLevel--; break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:499,505 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:594,600 fail(pDiag->pOutFile == NULL); fail((size_t)ucTag >= elementsof(atDocBookTags)); - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); vPrintLevel(pDiag->pOutFile); } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:512,518 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:607,613 atDocBookTags[(UINT)ucTag].szTagname, szAttribute); } - if (atDocBookTags[(UINT)ucTag].bAddNewline) { + if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); pDiag->lXleft = 0; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:568,574 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:663,669 * vCreateBookIntro - create title and bookinfo */ void - vCreateBookIntro(diagram_type *pDiag, int iWordVersion, encoding_type eEncoding) + vCreateBookIntro(diagram_type *pDiag, int iVersion) { const char *szTitle, *szSubject, *szAuthor; const char *szLastSaveDtm, *szCompany; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:577,585 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:672,682 fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); - fail(iWordVersion < 0); + fail(iVersion < 0); fail(eEncoding == encoding_neutral); + iWordVersion = iVersion; + bOldMacFile = bIsOldMacFile(); szTitle = szGetTitle(); szSubject = szGetSubject(); szAuthor = szGetAuthor(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:598,605 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:695,701 /* Book title */ if (szTitle != NULL && szTitle[0] != '\0') { vAddStartTag(pDiag, TAG_TITLE, NULL); - vPrintSpecial(pDiag->pOutFile, - szTitle, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szTitle); vAddEndTag(pDiag, TAG_TITLE); } /* Bookinfo */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:611,644 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:707,735 vAddStartTag(pDiag, TAG_BOOKINFO, NULL); if (szTitle != NULL && szTitle[0] != '\0') { vAddStartTag(pDiag, TAG_TITLE, NULL); - vPrintSpecial(pDiag->pOutFile, - szTitle, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szTitle); vAddEndTag(pDiag, TAG_TITLE); } if (szSubject != NULL && szSubject[0] != '\0') { vAddStartTag(pDiag, TAG_SUBTITLE, NULL); - vPrintSpecial(pDiag->pOutFile, - szSubject, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szSubject); vAddEndTag(pDiag, TAG_SUBTITLE); } if (szAuthor != NULL && szAuthor[0] != '\0') { vAddStartTag(pDiag, TAG_AUTHOR, NULL); vAddStartTag(pDiag, TAG_SURNAME, NULL); - vPrintSpecial(pDiag->pOutFile, - szAuthor, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szAuthor); vAddEndTag(pDiag, TAG_SURNAME); vAddEndTag(pDiag, TAG_AUTHOR); } if (szLastSaveDtm != NULL && szLastSaveDtm[0] != '\0') { vAddStartTag(pDiag, TAG_DATE, NULL); - vPrintSpecial(pDiag->pOutFile, - szLastSaveDtm, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szLastSaveDtm); vAddEndTag(pDiag, TAG_DATE); } if (szCompany != NULL && szCompany[0] != '\0') { vAddStartTag(pDiag, TAG_CORPNAME, NULL); - vPrintSpecial(pDiag->pOutFile, - szCompany, iWordVersion, eEncoding); + vPrintSpecialString(pDiag, szCompany); vAddEndTag(pDiag, TAG_CORPNAME); } vAddEndTag(pDiag, TAG_BOOKINFO); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:649,659 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:740,751 * vPrologueXML - perform the XML initialization */ void - vPrologueXML(diagram_type *pDiag) + vPrologueXML(diagram_type *pDiag, const options_type *pOptions) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); + fail(pOptions == NULL); #if defined(DEBUG) vCheckTagTable(); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:660,670 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:752,764 #endif /* DEBUG */ /* Set global variables to their start values */ + eEncoding = pOptions->eEncoding; bEmphasisOpen = FALSE; bSuperscriptOpen = FALSE; bSubscriptOpen = FALSE; bTitleOpen = FALSE; bTableOpen = FALSE; + bFootnoteOpen = FALSE; uiParagraphLevel = 0; uiListLevel = 0; bEmptyListLevel = TRUE; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:671,676 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:765,771 usHeaderLevelCurrent = 0; bEmptyHeaderLevel = TRUE; iTableColumnsCurrent = 0; + uiFootnoteNumber = 0; pDiag->lXleft = 0; pDiag->lYtop = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:707,712 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:802,808 vPrintXML(diagram_type *pDiag, const char *szString, size_t tStringLength, USHORT usFontstyle) { + const char *szAttr; int iCount; size_t tNextFree; BOOL bNotReady, bEmphasisNew, bSuperscriptNew, bSubscriptNew; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:718,729 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:814,833 return; } - bEmphasisNew = bIsBold(usFontstyle) || - bIsItalic(usFontstyle) || - bIsUnderline(usFontstyle) || - bIsStrike(usFontstyle); - bSuperscriptNew = bIsSuperscript(usFontstyle); - bSubscriptNew = bIsSubscript(usFontstyle); + if (tStringLength == 1 && szString[0] == FOOTNOTE_OR_ENDNOTE) { + /* Don't do anything special for just a single footnote */ + bEmphasisNew = FALSE; + bSuperscriptNew = FALSE; + bSubscriptNew = FALSE; + } else { + /* Situation normal */ + bEmphasisNew = bIsBold(usFontstyle) || + bIsItalic(usFontstyle) || + bIsUnderline(usFontstyle) || + bIsStrike(usFontstyle); + bSuperscriptNew = bIsSuperscript(usFontstyle); + bSubscriptNew = bIsSubscript(usFontstyle); + } /* End what has to be ended (or more to keep the stack happy) */ tNextFree = 0; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:770,776 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:874,891 /* Start what has to be started */ if (bEmphasisNew && !bEmphasisOpen) { - vAddStartTag(pDiag, TAG_EMPHASIS, NULL); + if (bIsBold(usFontstyle)) { + szAttr = "role='bold'"; + } else if (bIsItalic(usFontstyle)) { + szAttr = NULL; + } else if (bIsUnderline(usFontstyle)) { + szAttr = "role='underline'"; + } else if (bIsStrike(usFontstyle)) { + szAttr = "role='strikethrough'"; + } else { + szAttr = NULL; + } + vAddStartTag(pDiag, TAG_EMPHASIS, szAttr); } if (bSuperscriptNew && !bSuperscriptOpen) { vAddStartTag(pDiag, TAG_SUPERSCRIPT, NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:781,787 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:896,902 /* The print the string */ for (iCount = 0; iCount < (int)tStringLength; iCount++) { - vPrintChar(pDiag->pOutFile, szString[iCount]); + vPrintChar(pDiag, szString[iCount]); } } /* end of vPrintXML */ /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:793,802 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:908,918 { fail(pDiag == NULL); + /* if (uiParagraphLevel != 0) { - vEndOfParagraphXML(pDiag, INT_MAX); - vStartOfParagraphXML(pDiag, INT_MAX); + We need something like HTML's
tag } + */ } /* end of vMove2NextLineXML */ /* /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:826,837 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:942,953 * in paragraphs. Other paragraph levels result from DocBooks special needs. */ void - vStartOfParagraphXML(diagram_type *pDiag, int iMaxLevel) + vStartOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel) { fail(pDiag == NULL); - if (uiParagraphLevel >= (UINT)iMaxLevel || bTitleOpen) { - /* To Word titles are just paragraphs */ + if (uiParagraphLevel >= uiMaxLevel || bTitleOpen) { + /* In Word a title is just a paragraph */ return; } if (uiListLevel != 0 && bEmptyListLevel) { /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:852,864 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:968,980 * Only for paragraph level one and for titles */ void - vEndOfParagraphXML(diagram_type *pDiag, int iMaxLevel) + vEndOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel) { UCHAR ucTopTag; fail(pDiag == NULL); - if (uiParagraphLevel > (UINT)iMaxLevel) { + if (uiParagraphLevel > uiMaxLevel) { DBG_DEC(uiParagraphLevel); return; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:918,925 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1034,1041 if (bTitleOpen) { /* A beginpage is not allowed when in a title */ /* So start a new paragraph */ - vEndOfParagraphXML(pDiag, INT_MAX); - vStartOfParagraphXML(pDiag, INT_MAX); + vEndOfParagraphXML(pDiag, UINT_MAX); + vStartOfParagraphXML(pDiag, UINT_MAX); return; } vAddCombinedTag(pDiag, TAG_BEGINPAGE, NULL); /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:1060,1065 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1176,1184 switch (ucNFC) { case LIST_ARABIC_NUM: case LIST_ORDINAL_NUM: + case LIST_NUMBER_TXT: + case LIST_ORDINAL_TXT: + case LIST_OUTLINE_NUM: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='arabic'"; break; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:1080,1085 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1199,1205 szAttr = "numeration='loweralpha'"; break; case LIST_SPECIAL: + case LIST_SPECIAL2: case LIST_BULLETS: ucTag = TAG_ITEMIZEDLIST; szAttr = "mark='bullet'"; /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:1087,1093 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1207,1213 default: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='arabic'"; - DBG_DEC(ucNFC); + DBG_HEX(ucNFC); DBG_FIXME(); break; } /n/sourcesdump/2006/0114/plan9/sys/src/cmd/aux/antiword/xml.c:1310,1316 - /n/sourcesdump/2006/0115/plan9/sys/src/cmd/aux/antiword/xml.c:1430,1436 vAddStartTag(pDiag, TAG_ENTRY, NULL); tStringLength = strlen(aszColTxt[iIndex]); for (tCount = 0; tCount < tStringLength; tCount++) { - vPrintChar(pDiag->pOutFile, aszColTxt[iIndex][tCount]); + vPrintChar(pDiag, aszColTxt[iIndex][tCount]); } vAddEndTag(pDiag, TAG_ENTRY); } [jmk] --rw-rw-r-- M 499692 jmk sys 34115 Jan 14 12:57 sys/src/cmd/aux/antiword/xml.c [jmk] --rw-rw-r-- M 499692 jmk sys 27773 Jan 14 12:57 sys/src/cmd/aux/antiword/antiword.h [jmk] --rw-rw-r-- M 499692 jmk sys 3910 Jan 14 12:57 sys/src/cmd/aux/antiword/asc85enc.c [jmk] --rw-rw-r-- M 499692 jmk sys 22483 Jan 14 12:57 sys/src/cmd/aux/antiword/blocklist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22456 Jan 14 12:57 sys/src/cmd/aux/antiword/chartrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 8933 Jan 14 12:57 sys/src/cmd/aux/antiword/datalist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3153 Jan 14 12:57 sys/src/cmd/aux/antiword/debug.h [jmk] --rw-rw-r-- M 499692 jmk sys 2724 Jan 14 12:57 sys/src/cmd/aux/antiword/depot.c [jmk] --rw-rw-r-- M 499692 jmk sys 12146 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 14486 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 1610 Jan 14 12:57 sys/src/cmd/aux/antiword/doclist.c [jmk] --rw-rw-r-- M 499692 jmk sys 26682 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.c [jmk] --rw-rw-r-- M 499692 jmk sys 1012 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.h [jmk] --rw-rw-r-- M 499692 jmk sys 10881 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.c [jmk] --rw-rw-r-- M 499692 jmk sys 12215 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.h [jmk] --rw-rw-r-- M 499692 jmk sys 613 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.c [jmk] --rw-rw-r-- M 499692 jmk sys 401 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.h [jmk] --rw-rw-r-- M 499692 jmk sys 3797 Jan 14 12:57 sys/src/cmd/aux/antiword/finddata.c [jmk] --rw-rw-r-- M 499692 jmk sys 7321 Jan 14 12:57 sys/src/cmd/aux/antiword/findtext.c [jmk] --rw-rw-r-- M 499692 jmk sys 3691 Jan 14 12:57 sys/src/cmd/aux/antiword/fmt_text.c [jmk] --rw-rw-r-- M 499692 jmk sys 126349 Jan 14 12:57 sys/src/cmd/aux/antiword/fontinfo.h [jmk] --rw-rw-r-- M 499692 jmk sys 4339 Jan 14 12:57 sys/src/cmd/aux/antiword/fontlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 27501 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts.c [jmk] --rw-rw-r-- M 499692 jmk sys 5843 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_r.c [jmk] --rw-rw-r-- M 499692 jmk sys 7542 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 9314 Jan 14 12:57 sys/src/cmd/aux/antiword/hdrftrlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 2504 Jan 14 12:57 sys/src/cmd/aux/antiword/icons.c [jmk] --rw-rw-r-- M 499692 jmk sys 26488 Jan 14 12:57 sys/src/cmd/aux/antiword/imgexam.c [jmk] --rw-rw-r-- M 499692 jmk sys 1703 Jan 14 12:57 sys/src/cmd/aux/antiword/imgtrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 1482 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 2159 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 7855 Jan 14 12:57 sys/src/cmd/aux/antiword/listlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 13140 Jan 14 12:57 sys/src/cmd/aux/antiword/main_ros.c [jmk] --rw-rw-r-- M 499692 jmk sys 8171 Jan 14 12:57 sys/src/cmd/aux/antiword/main_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 21663 Jan 14 12:57 sys/src/cmd/aux/antiword/misc.c [jmk] --rw-rw-r-- M 499692 jmk sys 1007 Jan 14 12:57 sys/src/cmd/aux/antiword/mkfile [jmk] --rw-rw-r-- M 499692 jmk sys 24813 Jan 14 12:57 sys/src/cmd/aux/antiword/notes.c [jmk] --rw-rw-r-- M 499692 jmk sys 24707 Jan 14 12:57 sys/src/cmd/aux/antiword/options.c [jmk] --rw-rw-r-- M 499692 jmk sys 19601 Jan 14 12:57 sys/src/cmd/aux/antiword/out2window.c [jmk] --rw-rw-r-- M 499692 jmk sys 10773 Jan 14 12:57 sys/src/cmd/aux/antiword/output.c [jmk] --rw-rw-r-- M 499692 jmk sys 31661 Jan 14 12:57 sys/src/cmd/aux/antiword/pdf.c [jmk] --rw-rw-r-- M 499692 jmk sys 2512 Jan 14 12:57 sys/src/cmd/aux/antiword/pictlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 4032 Jan 14 12:57 sys/src/cmd/aux/antiword/png2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 572 Jan 14 12:57 sys/src/cmd/aux/antiword/png2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 33883 Jan 14 12:57 sys/src/cmd/aux/antiword/postscript.c [jmk] --rw-rw-r-- M 499692 jmk sys 12600 Jan 14 12:57 sys/src/cmd/aux/antiword/prop0.c [jmk] --rw-rw-r-- M 499692 jmk sys 28409 Jan 14 12:57 sys/src/cmd/aux/antiword/prop2.c [jmk] --rw-rw-r-- M 499692 jmk sys 30660 Jan 14 12:57 sys/src/cmd/aux/antiword/prop6.c [jmk] --rw-rw-r-- M 499692 jmk sys 40247 Jan 14 12:57 sys/src/cmd/aux/antiword/prop8.c [jmk] --rw-rw-r-- M 499692 jmk sys 5989 Jan 14 12:57 sys/src/cmd/aux/antiword/properties.c [jmk] --rw-rw-r-- M 499692 jmk sys 2427 Jan 14 12:57 sys/src/cmd/aux/antiword/propmod.c [jmk] --rw-rw-r-- M 499692 jmk sys 5517 Jan 14 12:57 sys/src/cmd/aux/antiword/riscos.c [jmk] --rw-rw-r-- M 499692 jmk sys 2801 Jan 14 12:57 sys/src/cmd/aux/antiword/rowlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 9851 Jan 14 12:57 sys/src/cmd/aux/antiword/saveas.c [jmk] --rw-rw-r-- M 499692 jmk sys 3785 Jan 14 12:57 sys/src/cmd/aux/antiword/sectlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3416 Jan 14 12:57 sys/src/cmd/aux/antiword/startup.c [jmk] --rw-rw-r-- M 499692 jmk sys 12060 Jan 14 12:57 sys/src/cmd/aux/antiword/stylelist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22114 Jan 14 12:57 sys/src/cmd/aux/antiword/stylesheet.c [jmk] --rw-rw-r-- M 499692 jmk sys 23077 Jan 14 12:57 sys/src/cmd/aux/antiword/summary.c [jmk] --rw-rw-r-- M 499692 jmk sys 5122 Jan 14 12:57 sys/src/cmd/aux/antiword/tabstop.c [jmk] --rw-rw-r-- M 499692 jmk sys 3878 Jan 14 12:57 sys/src/cmd/aux/antiword/text.c [jmk] --rw-rw-r-- M 499692 jmk sys 818 Jan 14 12:57 sys/src/cmd/aux/antiword/unix.c [jmk] --rw-rw-r-- M 499692 jmk sys 7564 Jan 14 12:57 sys/src/cmd/aux/antiword/utf8.c [jmk] --rw-rw-r-- M 499692 jmk sys 800 Jan 14 12:57 sys/src/cmd/aux/antiword/version.h [jmk] --rw-rw-r-- M 499692 jmk sys 39070 Jan 14 12:57 sys/src/cmd/aux/antiword/word2text.c [jmk] --rw-rw-r-- M 499692 jmk sys 11743 Jan 14 12:57 sys/src/cmd/aux/antiword/wordconst.h [jmk] --rw-rw-r-- M 499692 jmk sys 2790 Jan 14 12:57 sys/src/cmd/aux/antiword/worddos.c [jmk] --rw-rw-r-- M 499692 jmk sys 7910 Jan 14 12:57 sys/src/cmd/aux/antiword/wordlib.c [jmk] --rw-rw-r-- M 499692 jmk sys 2658 Jan 14 12:57 sys/src/cmd/aux/antiword/wordmac.c [jmk] --rw-rw-r-- M 499692 jmk sys 22402 Jan 14 12:57 sys/src/cmd/aux/antiword/wordole.c [jmk] --rw-rw-r-- M 499692 jmk sys 8285 Jan 14 12:57 sys/src/cmd/aux/antiword/wordtypes.h [jmk] --rw-rw-r-- M 499692 jmk sys 5584 Jan 14 12:57 sys/src/cmd/aux/antiword/wordwin.c [jmk] --rw-rw-r-- M 499692 jmk sys 2501 Jan 14 12:57 sys/src/cmd/aux/antiword/xmalloc.c [jmk] --rw-rw-r-- M 499692 jmk sys 34115 Jan 14 12:57 sys/src/cmd/aux/antiword/xml.c [jmk] --rw-rw-r-- M 499692 jmk sys 27773 Jan 14 12:57 sys/src/cmd/aux/antiword/antiword.h [jmk] --rw-rw-r-- M 499692 jmk sys 3910 Jan 14 12:57 sys/src/cmd/aux/antiword/asc85enc.c [jmk] --rw-rw-r-- M 499692 jmk sys 22483 Jan 14 12:57 sys/src/cmd/aux/antiword/blocklist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22456 Jan 14 12:57 sys/src/cmd/aux/antiword/chartrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 8933 Jan 14 12:57 sys/src/cmd/aux/antiword/datalist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3153 Jan 14 12:57 sys/src/cmd/aux/antiword/debug.h [jmk] --rw-rw-r-- M 499692 jmk sys 2724 Jan 14 12:57 sys/src/cmd/aux/antiword/depot.c [jmk] --rw-rw-r-- M 499692 jmk sys 12146 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 14486 Jan 14 12:57 sys/src/cmd/aux/antiword/dib2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 1610 Jan 14 12:57 sys/src/cmd/aux/antiword/doclist.c [jmk] --rw-rw-r-- M 499692 jmk sys 26682 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.c [jmk] --rw-rw-r-- M 499692 jmk sys 1012 Jan 14 12:57 sys/src/cmd/aux/antiword/draw.h [jmk] --rw-rw-r-- M 499692 jmk sys 10881 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.c [jmk] --rw-rw-r-- M 499692 jmk sys 12215 Jan 14 12:57 sys/src/cmd/aux/antiword/drawfile.h [jmk] --rw-rw-r-- M 499692 jmk sys 613 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.c [jmk] --rw-rw-r-- M 499692 jmk sys 401 Jan 14 12:57 sys/src/cmd/aux/antiword/fail.h [jmk] --rw-rw-r-- M 499692 jmk sys 3797 Jan 14 12:57 sys/src/cmd/aux/antiword/finddata.c [jmk] --rw-rw-r-- M 499692 jmk sys 7321 Jan 14 12:57 sys/src/cmd/aux/antiword/findtext.c [jmk] --rw-rw-r-- M 499692 jmk sys 3691 Jan 14 12:57 sys/src/cmd/aux/antiword/fmt_text.c [jmk] --rw-rw-r-- M 499692 jmk sys 126349 Jan 14 12:57 sys/src/cmd/aux/antiword/fontinfo.h [jmk] --rw-rw-r-- M 499692 jmk sys 4339 Jan 14 12:57 sys/src/cmd/aux/antiword/fontlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 27501 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts.c [jmk] --rw-rw-r-- M 499692 jmk sys 5843 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_r.c [jmk] --rw-rw-r-- M 499692 jmk sys 7542 Jan 14 12:57 sys/src/cmd/aux/antiword/fonts_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 9314 Jan 14 12:57 sys/src/cmd/aux/antiword/hdrftrlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 2504 Jan 14 12:57 sys/src/cmd/aux/antiword/icons.c [jmk] --rw-rw-r-- M 499692 jmk sys 26488 Jan 14 12:57 sys/src/cmd/aux/antiword/imgexam.c [jmk] --rw-rw-r-- M 499692 jmk sys 1703 Jan 14 12:57 sys/src/cmd/aux/antiword/imgtrans.c [jmk] --rw-rw-r-- M 499692 jmk sys 1482 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 2159 Jan 14 12:57 sys/src/cmd/aux/antiword/jpeg2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 7855 Jan 14 12:57 sys/src/cmd/aux/antiword/listlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 13140 Jan 14 12:57 sys/src/cmd/aux/antiword/main_ros.c [jmk] --rw-rw-r-- M 499692 jmk sys 8171 Jan 14 12:57 sys/src/cmd/aux/antiword/main_u.c [jmk] --rw-rw-r-- M 499692 jmk sys 21663 Jan 14 12:57 sys/src/cmd/aux/antiword/misc.c [jmk] --rw-rw-r-- M 499692 jmk sys 1007 Jan 14 12:57 sys/src/cmd/aux/antiword/mkfile [jmk] --rw-rw-r-- M 499692 jmk sys 24813 Jan 14 12:57 sys/src/cmd/aux/antiword/notes.c [jmk] --rw-rw-r-- M 499692 jmk sys 24707 Jan 14 12:57 sys/src/cmd/aux/antiword/options.c [jmk] --rw-rw-r-- M 499692 jmk sys 19601 Jan 14 12:57 sys/src/cmd/aux/antiword/out2window.c [jmk] --rw-rw-r-- M 499692 jmk sys 10773 Jan 14 12:57 sys/src/cmd/aux/antiword/output.c [jmk] --rw-rw-r-- M 499692 jmk sys 31661 Jan 14 12:57 sys/src/cmd/aux/antiword/pdf.c [jmk] --rw-rw-r-- M 499692 jmk sys 2512 Jan 14 12:57 sys/src/cmd/aux/antiword/pictlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 4032 Jan 14 12:57 sys/src/cmd/aux/antiword/png2eps.c [jmk] --rw-rw-r-- M 499692 jmk sys 572 Jan 14 12:57 sys/src/cmd/aux/antiword/png2sprt.c [jmk] --rw-rw-r-- M 499692 jmk sys 33883 Jan 14 12:57 sys/src/cmd/aux/antiword/postscript.c [jmk] --rw-rw-r-- M 499692 jmk sys 12600 Jan 14 12:57 sys/src/cmd/aux/antiword/prop0.c [jmk] --rw-rw-r-- M 499692 jmk sys 28409 Jan 14 12:57 sys/src/cmd/aux/antiword/prop2.c [jmk] --rw-rw-r-- M 499692 jmk sys 30660 Jan 14 12:57 sys/src/cmd/aux/antiword/prop6.c [jmk] --rw-rw-r-- M 499692 jmk sys 40247 Jan 14 12:57 sys/src/cmd/aux/antiword/prop8.c [jmk] --rw-rw-r-- M 499692 jmk sys 5989 Jan 14 12:57 sys/src/cmd/aux/antiword/properties.c [jmk] --rw-rw-r-- M 499692 jmk sys 2427 Jan 14 12:57 sys/src/cmd/aux/antiword/propmod.c [jmk] --rw-rw-r-- M 499692 jmk sys 5517 Jan 14 12:57 sys/src/cmd/aux/antiword/riscos.c [jmk] --rw-rw-r-- M 499692 jmk sys 2801 Jan 14 12:57 sys/src/cmd/aux/antiword/rowlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 9851 Jan 14 12:57 sys/src/cmd/aux/antiword/saveas.c [jmk] --rw-rw-r-- M 499692 jmk sys 3785 Jan 14 12:57 sys/src/cmd/aux/antiword/sectlist.c [jmk] --rw-rw-r-- M 499692 jmk sys 3416 Jan 14 12:57 sys/src/cmd/aux/antiword/startup.c [jmk] --rw-rw-r-- M 499692 jmk sys 12060 Jan 14 12:57 sys/src/cmd/aux/antiword/stylelist.c [jmk] --rw-rw-r-- M 499692 jmk sys 22114 Jan 14 12:57 sys/src/cmd/aux/antiword/stylesheet.c [jmk] --rw-rw-r-- M 499692 jmk sys 23077 Jan 14 12:57 sys/src/cmd/aux/antiword/summary.c [jmk] --rw-rw-r-- M 499692 jmk sys 5122 Jan 14 12:57 sys/src/cmd/aux/antiword/tabstop.c [jmk] --rw-rw-r-- M 499692 jmk sys 3878 Jan 14 12:57 sys/src/cmd/aux/antiword/text.c [jmk] --rw-rw-r-- M 499692 jmk sys 818 Jan 14 12:57 sys/src/cmd/aux/antiword/unix.c [jmk] --rw-rw-r-- M 499692 jmk sys 7564 Jan 14 12:57 sys/src/cmd/aux/antiword/utf8.c [jmk] --rw-rw-r-- M 499692 jmk sys 800 Jan 14 12:57 sys/src/cmd/aux/antiword/version.h [jmk] --rw-rw-r-- M 499692 jmk sys 39070 Jan 14 12:57 sys/src/cmd/aux/antiword/word2text.c [jmk] --rw-rw-r-- M 499692 jmk sys 11743 Jan 14 12:57 sys/src/cmd/aux/antiword/wordconst.h [jmk] --rw-rw-r-- M 499692 jmk sys 2790 Jan 14 12:57 sys/src/cmd/aux/antiword/worddos.c [jmk] --rw-rw-r-- M 499692 jmk sys 7910 Jan 14 12:57 sys/src/cmd/aux/antiword/wordlib.c [jmk] --rw-rw-r-- M 499692 jmk sys 2658 Jan 14 12:57 sys/src/cmd/aux/antiword/wordmac.c [jmk] --rw-rw-r-- M 499692 jmk sys 22402 Jan 14 12:57 sys/src/cmd/aux/antiword/wordole.c [jmk] --rw-rw-r-- M 499692 jmk sys 8285 Jan 14 12:57 sys/src/cmd/aux/antiword/wordtypes.h [jmk] --rw-rw-r-- M 499692 jmk sys 5584 Jan 14 12:57 sys/src/cmd/aux/antiword/wordwin.c [jmk] --rw-rw-r-- M 499692 jmk sys 2501 Jan 14 12:57 sys/src/cmd/aux/antiword/xmalloc.c [jmk] --rw-rw-r-- M 499692 jmk sys 34115 Jan 14 12:57 sys/src/cmd/aux/antiword/xml.c