diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fmt__text_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fmt__text_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,183 @@ + + +
+ +00001 /* +00002 * fmt_text.c +00003 * Copyright (C) 2004 A.J. van Os; Released under GNU GPL +00004 * +00005 * Description: +00006 * Functions to deal with the Formatted Text format +00007 * +00008 * Based on patches send by: Ofir Reichenberg <ofir@qlusters.com> +00009 * +00010 * The credit should go to him, but all the bugs are mine. +00011 */ +00012 +00013 #include <string.h> +00014 #include "antiword.h" +00015 +00016 /* The character set */ +00017 static encoding_type eEncoding = encoding_neutral; +00018 /* Current vertical position information */ +00019 static long lYtopCurr = 0; +00020 /* Local representation of the non-breaking space */ +00021 static UCHAR ucNbsp = 0; +00022 +00023 +00024 /* +00025 * vPrologueFMT - set options and perform the Formatted Text initialization +00026 */ +00027 void +00028 vPrologueFMT(diagram_type *pDiag, const options_type *pOptions) +00029 { +00030 fail(pDiag == NULL); +00031 fail(pOptions == NULL); +00032 +00033 eEncoding = pOptions->eEncoding; +00034 pDiag->lXleft = 0; +00035 pDiag->lYtop = 0; +00036 lYtopCurr = 0; +00037 } /* end of vPrologueFMT */ +00038 +00039 /* +00040 * vPrintFMT - print a Formatted Text string +00041 */ +00042 static void +00043 vPrintFMT(FILE *pFile, +00044 const char *szString, size_t tStringLength, USHORT usFontstyle) +00045 { +00046 const UCHAR *pucByte, *pucStart, *pucLast, *pucNonSpace; +00047 +00048 fail(szString == NULL); +00049 +00050 if (szString == NULL || szString[0] == '\0' || tStringLength == 0) { +00051 return; +00052 } +00053 +00054 if (eEncoding == encoding_utf_8) { +00055 fprintf(pFile, "%.*s", (int)tStringLength, szString); +00056 return; +00057 } +00058 +00059 if (ucNbsp == 0) { +00060 ucNbsp = ucGetNbspCharacter(); +00061 DBG_HEX_C(ucNbsp != 0xa0, ucNbsp); +00062 } +00063 +00064 pucStart = (UCHAR *)szString; +00065 pucLast = pucStart + tStringLength - 1; +00066 pucNonSpace = pucLast; +00067 while ((*pucNonSpace == (UCHAR)' ' || *pucNonSpace == ucNbsp) && +00068 pucNonSpace > pucStart) { +00069 pucNonSpace--; +00070 } +00071 +00072 /* 1: The spaces at the start */ +00073 pucByte = pucStart; +00074 while ((*pucByte == (UCHAR)' ' || *pucByte == ucNbsp) && +00075 pucByte <= pucLast) { +00076 (void)putc(' ', pFile); +00077 pucByte++; +00078 } +00079 +00080 if (pucByte > pucLast) { +00081 /* There is no text, just spaces */ +00082 return; +00083 } +00084 +00085 /* 2: Start the *bold*, /italic/ and _underline_ */ +00086 if (bIsBold(usFontstyle)) { +00087 (void)putc('*', pFile); +00088 } +00089 if (bIsItalic(usFontstyle)) { +00090 (void)putc('/', pFile); +00091 } +00092 if (bIsUnderline(usFontstyle)) { +00093 (void)putc('_', pFile); +00094 } +00095 +00096 /* 3: The text itself */ +00097 while (pucByte <= pucNonSpace) { +00098 if (*pucByte == ucNbsp) { +00099 (void)putc(' ', pFile); +00100 } else { +00101 (void)putc((char)*pucByte, pFile); +00102 } +00103 pucByte++; +00104 } +00105 +00106 /* 4: End the *bold*, /italic/ and _underline_ */ +00107 if (bIsUnderline(usFontstyle)) { +00108 (void)putc('_', pFile); +00109 } +00110 if (bIsItalic(usFontstyle)) { +00111 (void)putc('/', pFile); +00112 } +00113 if (bIsBold(usFontstyle)) { +00114 (void)putc('*', pFile); +00115 } +00116 +00117 /* 5: The spaces at the end */ +00118 while (pucByte <= pucLast) { +00119 (void)putc(' ', pFile); +00120 pucByte++; +00121 } +00122 } /* end of vPrintFMT */ +00123 +00124 /* +00125 * vMoveTo - move to the given X,Y coordinates +00126 * +00127 * Move the current position of the given diagram to its X,Y coordinates, +00128 * start on a new page if needed +00129 */ +00130 static void +00131 vMoveTo(diagram_type *pDiag) +00132 { +00133 int iCount, iNbr; +00134 +00135 fail(pDiag == NULL); +00136 fail(pDiag->pOutFile == NULL); +00137 +00138 if (pDiag->lYtop != lYtopCurr) { +00139 iNbr = iDrawUnits2Char(pDiag->lXleft); +00140 for (iCount = 0; iCount < iNbr; iCount++) { +00141 (void)putc(FILLER_CHAR, pDiag->pOutFile); +00142 } +00143 lYtopCurr = pDiag->lYtop; +00144 } +00145 } /* end of vMoveTo */ +00146 +00147 /* +00148 * vSubstringFMT - print a sub string +00149 */ +00150 void +00151 vSubstringFMT(diagram_type *pDiag, +00152 const char *szString, size_t tStringLength, long lStringWidth, +00153 USHORT usFontstyle) +00154 { +00155 fail(pDiag == NULL || szString == NULL); +00156 fail(pDiag->pOutFile == NULL); +00157 fail(pDiag->lXleft < 0); +00158 fail(tStringLength != strlen(szString)); +00159 +00160 if (szString[0] == '\0' || tStringLength == 0) { +00161 return; +00162 } +00163 +00164 vMoveTo(pDiag); +00165 vPrintFMT(pDiag->pOutFile, szString, tStringLength, usFontstyle); +00166 pDiag->lXleft += lStringWidth; +00167 } /* end of vSubstringFMT */ +