mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
183 lines
3.8 KiB
C
183 lines
3.8 KiB
C
/*
|
|
* text.c
|
|
* Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL
|
|
*
|
|
* Description:
|
|
* Functions to deal with the Text format
|
|
*
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "antiword.h"
|
|
|
|
/* The character set */
|
|
static encoding_type eEncoding = encoding_neutral;
|
|
/* Current vertical position information */
|
|
static long lYtopCurr = 0;
|
|
/* Local representation of the non-breaking space */
|
|
static UCHAR ucNbsp = 0;
|
|
|
|
|
|
/*
|
|
* vPrologueTXT - set options and perform the Text initialization
|
|
*/
|
|
void
|
|
vPrologueTXT(diagram_type *pDiag, const options_type *pOptions)
|
|
{
|
|
fail(pDiag == NULL);
|
|
fail(pOptions == NULL);
|
|
|
|
eEncoding = pOptions->eEncoding;
|
|
pDiag->lXleft = 0;
|
|
pDiag->lYtop = 0;
|
|
lYtopCurr = 0;
|
|
} /* end of vPrologueTXT */
|
|
|
|
/*
|
|
* vEpilogueTXT - clean up after everything is done
|
|
*/
|
|
void
|
|
vEpilogueTXT(FILE *pOutFile)
|
|
{
|
|
fail(pOutFile == NULL);
|
|
|
|
fprintf(pOutFile, "\n");
|
|
} /* end of vEpilogueTXT */
|
|
|
|
/*
|
|
* vPrintTXT - print a Text string
|
|
*/
|
|
static void
|
|
vPrintTXT(FILE *pFile, const char *szString, size_t tStringLength)
|
|
{
|
|
const UCHAR *ucBytes;
|
|
size_t tCount;
|
|
|
|
fail(szString == NULL);
|
|
|
|
if (szString == NULL || szString[0] == '\0' || tStringLength == 0) {
|
|
return;
|
|
}
|
|
|
|
if (eEncoding == encoding_utf_8) {
|
|
fprintf(pFile, "%.*s", (int)tStringLength, szString);
|
|
return;
|
|
}
|
|
|
|
if (ucNbsp == 0) {
|
|
ucNbsp = ucGetNbspCharacter();
|
|
DBG_HEX_C(ucNbsp != 0xa0, ucNbsp);
|
|
}
|
|
|
|
ucBytes = (UCHAR *)szString;
|
|
for (tCount = 0; tCount < tStringLength ; tCount++) {
|
|
if (ucBytes[tCount] == ucNbsp) {
|
|
(void)putc(' ', pFile);
|
|
} else {
|
|
(void)putc(szString[tCount], pFile);
|
|
}
|
|
}
|
|
} /* end of vPrintTXT */
|
|
|
|
/*
|
|
* 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
|
|
vMoveTo(diagram_type *pDiag)
|
|
{
|
|
int iCount, iNbr;
|
|
|
|
fail(pDiag == NULL);
|
|
fail(pDiag->pOutFile == NULL);
|
|
|
|
if (pDiag->lYtop != lYtopCurr) {
|
|
iNbr = iDrawUnits2Char(pDiag->lXleft);
|
|
for (iCount = 0; iCount < iNbr; iCount++) {
|
|
(void)putc(FILLER_CHAR, pDiag->pOutFile);
|
|
}
|
|
lYtopCurr = pDiag->lYtop;
|
|
}
|
|
} /* end of vMoveTo */
|
|
|
|
/*
|
|
* vMove2NextLineTXT - move to the next line
|
|
*/
|
|
void
|
|
vMove2NextLineTXT(diagram_type *pDiag)
|
|
{
|
|
fail(pDiag == NULL);
|
|
fail(pDiag->pOutFile == NULL);
|
|
|
|
pDiag->lYtop++;
|
|
(void)fprintf(pDiag->pOutFile, "\n");
|
|
} /* end of vMove2NextLineTXT */
|
|
|
|
/*
|
|
* vSubstringTXT - print a sub string
|
|
*/
|
|
void
|
|
vSubstringTXT(diagram_type *pDiag,
|
|
const char *szString, size_t tStringLength, long lStringWidth)
|
|
{
|
|
fail(pDiag == NULL || szString == NULL);
|
|
fail(pDiag->pOutFile == NULL);
|
|
fail(pDiag->lXleft < 0);
|
|
fail(tStringLength != strlen(szString));
|
|
|
|
if (szString[0] == '\0' || tStringLength == 0) {
|
|
return;
|
|
}
|
|
|
|
vMoveTo(pDiag);
|
|
vPrintTXT(pDiag->pOutFile, szString, tStringLength);
|
|
pDiag->lXleft += lStringWidth;
|
|
} /* end of vSubstringTXT */
|
|
|
|
/*
|
|
* Create an start of paragraph by moving the y-top mark
|
|
*/
|
|
void
|
|
vStartOfParagraphTXT(diagram_type *pDiag, long lBeforeIndentation)
|
|
{
|
|
fail(pDiag == NULL);
|
|
fail(lBeforeIndentation < 0);
|
|
|
|
if (lBeforeIndentation >= lTwips2MilliPoints(HEADING_GAP)) {
|
|
/* A large gap is replaced by an empty line */
|
|
vMove2NextLineTXT(pDiag);
|
|
}
|
|
} /* end of vStartOfParagraphTXT */
|
|
|
|
/*
|
|
* Create an end of paragraph by moving the y-top mark
|
|
*/
|
|
void
|
|
vEndOfParagraphTXT(diagram_type *pDiag, long lAfterIndentation)
|
|
{
|
|
fail(pDiag == NULL);
|
|
fail(pDiag->pOutFile == NULL);
|
|
fail(lAfterIndentation < 0);
|
|
|
|
if (pDiag->lXleft > 0) {
|
|
/* To the start of the line */
|
|
vMove2NextLineTXT(pDiag);
|
|
}
|
|
|
|
if (lAfterIndentation >= lTwips2MilliPoints(HEADING_GAP)) {
|
|
/* A large gap is replaced by an empty line */
|
|
vMove2NextLineTXT(pDiag);
|
|
}
|
|
} /* end of vEndOfParagraphTXT */
|
|
|
|
/*
|
|
* Create an end of page
|
|
*/
|
|
void
|
|
vEndOfPageTXT(diagram_type *pDiag, long lAfterIndentation)
|
|
{
|
|
vEndOfParagraphTXT(pDiag, lAfterIndentation);
|
|
} /* end of vEndOfPageTXT */
|