diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/antiword/text.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/antiword/text.c')
-rwxr-xr-x | sys/src/cmd/aux/antiword/text.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/antiword/text.c b/sys/src/cmd/aux/antiword/text.c new file mode 100755 index 000000000..bd3dc9219 --- /dev/null +++ b/sys/src/cmd/aux/antiword/text.c @@ -0,0 +1,182 @@ +/* + * 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 */ |