mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
539 lines
10 KiB
C
539 lines
10 KiB
C
/*
|
|
* 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 */
|