/* * output.c * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL * * Description: * Generic output generating functions */ #include "antiword.h" static conversion_type eConversionType = conversion_unknown; static encoding_type eEncoding = encoding_neutral; /* * vPrologue1 - get options and call a specific initialization */ static void vPrologue1(diagram_type *pDiag, const char *szTask, const char *szFilename) { options_type tOptions; fail(pDiag == NULL); fail(szTask == NULL || szTask[0] == '\0'); vGetOptions(&tOptions); eConversionType = tOptions.eConversionType; eEncoding = tOptions.eEncoding; switch (eConversionType) { 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, &tOptions); break; case conversion_pdf: vProloguePDF(pDiag, szTask, &tOptions); break; default: DBG_DEC(eConversionType); break; } } /* end of vPrologue1 */ /* * vEpilogue - clean up after everything is done */ static void vEpilogue(diagram_type *pDiag) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: vEpilogueTXT(pDiag->pOutFile); break; case conversion_ps: vEpiloguePS(pDiag); break; case conversion_xml: vEpilogueXML(pDiag); break; case conversion_pdf: vEpiloguePDF(pDiag); break; default: DBG_DEC(eConversionType); break; } } /* end of vEpilogue */ /* * vImagePrologue - perform image initialization */ void vImagePrologue(diagram_type *pDiag, const imagedata_type *pImg) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: vImageProloguePS(pDiag, pImg); break; case conversion_xml: break; case conversion_pdf: vImageProloguePDF(pDiag, pImg); break; default: DBG_DEC(eConversionType); break; } } /* end of vImagePrologue */ /* * vImageEpilogue - clean up an image */ void vImageEpilogue(diagram_type *pDiag) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: vImageEpiloguePS(pDiag); break; case conversion_xml: break; case conversion_pdf: vImageEpiloguePDF(pDiag); break; default: DBG_DEC(eConversionType); break; } } /* end of vImageEpilogue */ /* * bAddDummyImage - add a dummy image * * return TRUE when successful, otherwise FALSE */ BOOL bAddDummyImage(diagram_type *pDiag, const imagedata_type *pImg) { 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; } } /* end of bAddDummyImage */ /* * pCreateDiagram - create and initialize a diagram * * remark: does not return if the diagram can't be created */ diagram_type * pCreateDiagram(const char *szTask, const char *szFilename) { diagram_type *pDiag; fail(szTask == NULL || szTask[0] == '\0'); DBG_MSG("pCreateDiagram"); /* Get the necessary memory */ pDiag = xmalloc(sizeof(diagram_type)); /* Initialization */ pDiag->pOutFile = stdout; vPrologue1(pDiag, szTask, szFilename); /* Return success */ return pDiag; } /* end of pCreateDiagram */ /* * vDestroyDiagram - remove a diagram by freeing the memory it uses */ void vDestroyDiagram(diagram_type *pDiag) { DBG_MSG("vDestroyDiagram"); fail(pDiag == NULL); if (pDiag == NULL) { return; } vEpilogue(pDiag); pDiag = xfree(pDiag); } /* end of vDestroyDiagram */ /* * vPrologue2 - call a specific initialization */ void vPrologue2(diagram_type *pDiag, int iWordVersion) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: vAddFontsPS(pDiag); break; case conversion_xml: vCreateBookIntro(pDiag, iWordVersion); break; case conversion_pdf: vCreateInfoDictionary(pDiag, iWordVersion); vAddFontsPDF(pDiag); break; default: DBG_DEC(eConversionType); break; } } /* end of vPrologue2 */ /* * vMove2NextLine - move to the next line */ void vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef, USHORT usFontSize) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); switch (eConversionType) { case conversion_text: case conversion_fmt_text: vMove2NextLineTXT(pDiag); break; case conversion_ps: vMove2NextLinePS(pDiag, usFontSize); break; case conversion_xml: vMove2NextLineXML(pDiag); break; case conversion_pdf: vMove2NextLinePDF(pDiag, usFontSize); break; default: DBG_DEC(eConversionType); break; } } /* end of vMove2NextLine */ /* * vSubstring2Diagram - put a sub string into a diagram */ void vSubstring2Diagram(diagram_type *pDiag, char *szString, size_t tStringLength, long lStringWidth, UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef, USHORT usFontSize, USHORT usMaxFontSize) { switch (eConversionType) { 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, usFontSize, usMaxFontSize); break; case conversion_xml: 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; } pDiag->lXleft += lStringWidth; } /* end of vSubstring2Diagram */ /* * Create a start of paragraph (phase 1) * Before indentation, list numbering, bullets etc. */ void vStartOfParagraph1(diagram_type *pDiag, long lBeforeIndentation) { fail(pDiag == NULL); switch (eConversionType) { case conversion_text: case conversion_fmt_text: vStartOfParagraphTXT(pDiag, lBeforeIndentation); break; case conversion_ps: vStartOfParagraphPS(pDiag, lBeforeIndentation); break; case conversion_xml: break; case conversion_pdf: vStartOfParagraphPDF(pDiag, lBeforeIndentation); break; default: DBG_DEC(eConversionType); break; } } /* end of vStartOfParagraph1 */ /* * Create a start of paragraph (phase 2) * After indentation, list numbering, bullets etc. */ void vStartOfParagraph2(diagram_type *pDiag) { fail(pDiag == NULL); switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vStartOfParagraphXML(pDiag, 1); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vStartOfParagraph2 */ /* * Create an end of paragraph */ void vEndOfParagraph(diagram_type *pDiag, drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation) { fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); fail(lAfterIndentation < 0); switch (eConversionType) { case conversion_text: case conversion_fmt_text: vEndOfParagraphTXT(pDiag, lAfterIndentation); break; case conversion_ps: 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; } } /* end of vEndOfParagraph */ /* * Create an end of page */ void 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, bNewSection); break; case conversion_xml: vEndOfPageXML(pDiag); break; case conversion_pdf: vEndOfPagePDF(pDiag, bNewSection); break; default: DBG_DEC(eConversionType); break; } } /* end of vEndOfPage */ /* * vSetHeaders - set the headers */ void vSetHeaders(diagram_type *pDiag, USHORT usIstd) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vSetHeadersXML(pDiag, usIstd); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vSetHeaders */ /* * Create a start of list */ void vStartOfList(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vStartOfListXML(pDiag, ucNFC, bIsEndOfTable); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vStartOfList */ /* * Create an end of list */ void vEndOfList(diagram_type *pDiag) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vEndOfListXML(pDiag); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vEndOfList */ /* * Create a start of a list item */ void vStartOfListItem(diagram_type *pDiag, BOOL bNoMarks) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vStartOfListItemXML(pDiag, bNoMarks); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vStartOfListItem */ /* * Create an end of a table */ void vEndOfTable(diagram_type *pDiag) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vEndOfTableXML(pDiag); break; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } } /* end of vEndOfTable */ /* * Add a table row * * Returns TRUE when conversion type is XML */ BOOL bAddTableRow(diagram_type *pDiag, char **aszColTxt, int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo) { switch (eConversionType) { case conversion_text: case conversion_fmt_text: break; case conversion_ps: break; case conversion_xml: vAddTableRowXML(pDiag, aszColTxt, iNbrOfColumns, asColumnWidth, ucBorderInfo); return TRUE; case conversion_pdf: break; default: DBG_DEC(eConversionType); break; } return FALSE; } /* end of bAddTableRow */