summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/antiword/text.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/aux/antiword/text.c182
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 */