diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/prop0_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/prop0_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,505 @@ + + +
+ +00001 /* +00002 * prop0.c +00003 * Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL +00004 * +00005 * Description: +00006 * Read the property information from a Word for DOS file +00007 */ +00008 +00009 #include <string.h> +00010 #include <time.h> +00011 #include "antiword.h" +00012 +00013 +00014 /* +00015 * tConvertDosDate - convert DOS date format +00016 * +00017 * returns Unix time_t or -1 +00018 */ +00019 static time_t +00020 tConvertDosDate(const char *szDosDate) +00021 { +00022 struct tm tTime; +00023 const char *pcTmp; +00024 time_t tResult; +00025 +00026 memset(&tTime, 0, sizeof(tTime)); +00027 pcTmp = szDosDate; +00028 /* Get the month */ +00029 if (!isdigit(*pcTmp)) { +00030 return (time_t)-1; +00031 } +00032 tTime.tm_mon = (int)(*pcTmp - '0'); +00033 pcTmp++; +00034 if (isdigit(*pcTmp)) { +00035 tTime.tm_mon *= 10; +00036 tTime.tm_mon += (int)(*pcTmp - '0'); +00037 pcTmp++; +00038 } +00039 /* Get the first separater */ +00040 if (isalnum(*pcTmp)) { +00041 return (time_t)-1; +00042 } +00043 pcTmp++; +00044 /* Get the day */ +00045 if (!isdigit(*pcTmp)) { +00046 return (time_t)-1; +00047 } +00048 tTime.tm_mday = (int)(*pcTmp - '0'); +00049 pcTmp++; +00050 if (isdigit(*pcTmp)) { +00051 tTime.tm_mday *= 10; +00052 tTime.tm_mday += (int)(*pcTmp - '0'); +00053 pcTmp++; +00054 } +00055 /* Get the second separater */ +00056 if (isalnum(*pcTmp)) { +00057 return (time_t)-1; +00058 } +00059 pcTmp++; +00060 /* Get the year */ +00061 if (!isdigit(*pcTmp)) { +00062 return (time_t)-1; +00063 } +00064 tTime.tm_year = (int)(*pcTmp - '0'); +00065 pcTmp++; +00066 if (isdigit(*pcTmp)) { +00067 tTime.tm_year *= 10; +00068 tTime.tm_year += (int)(*pcTmp - '0'); +00069 pcTmp++; +00070 } +00071 /* Check the values */ +00072 if (tTime.tm_mon == 0 || tTime.tm_mday == 0 || tTime.tm_mday > 31) { +00073 return (time_t)-1; +00074 } +00075 /* Correct the values */ +00076 tTime.tm_mon--; /* From 01-12 to 00-11 */ +00077 if (tTime.tm_year < 80) { +00078 tTime.tm_year += 100; /* 00 means 2000 is 100 */ +00079 } +00080 tTime.tm_isdst = -1; +00081 tResult = mktime(&tTime); +00082 NO_DBG_MSG(ctime(&tResult)); +00083 return tResult; +00084 } /* end of tConvertDosDate */ +00085 +00086 /* +00087 * Build the lists with Document Property Information for Word for DOS files +00088 */ +00089 void +00090 vGet0DopInfo(FILE *pFile, const UCHAR *aucHeader) +00091 { +00092 document_block_type tDocument; +00093 UCHAR *aucBuffer; +00094 ULONG ulBeginSumdInfo, ulBeginNextBlock; +00095 size_t tLen; +00096 USHORT usOffset; +00097 +00098 tDocument.ucHdrFtrSpecification = 0; +00099 tDocument.usDefaultTabWidth = usGetWord(0x70, aucHeader); /* dxaTab */ +00100 tDocument.tCreateDate = (time_t)-1; +00101 tDocument.tRevisedDate = (time_t)-1; +00102 +00103 ulBeginSumdInfo = 128 * (ULONG)usGetWord(0x1c, aucHeader); +00104 DBG_HEX(ulBeginSumdInfo); +00105 ulBeginNextBlock = 128 * (ULONG)usGetWord(0x6a, aucHeader); +00106 DBG_HEX(ulBeginNextBlock); +00107 +00108 if (ulBeginSumdInfo < ulBeginNextBlock && ulBeginNextBlock != 0) { +00109 /* There is a summary information block */ +00110 tLen = (size_t)(ulBeginNextBlock - ulBeginSumdInfo); +00111 aucBuffer = xmalloc(tLen); +00112 /* Read the summary information block */ +00113 if (bReadBytes(aucBuffer, tLen, ulBeginSumdInfo, pFile)) { +00114 usOffset = usGetWord(12, aucBuffer); +00115 if (aucBuffer[usOffset] != 0) { +00116 NO_DBG_STRN(aucBuffer + usOffset, 8); +00117 tDocument.tRevisedDate = +00118 tConvertDosDate((char *)aucBuffer + usOffset); +00119 } +00120 usOffset = usGetWord(14, aucBuffer); +00121 if (aucBuffer[usOffset] != 0) { +00122 NO_DBG_STRN(aucBuffer + usOffset, 8); +00123 tDocument.tCreateDate = +00124 tConvertDosDate((char *)aucBuffer + usOffset); +00125 } +00126 } +00127 aucBuffer = xfree(aucBuffer); +00128 } +00129 vCreateDocumentInfoList(&tDocument); +00130 } /* end of vGet0DopInfo */ +00131 +00132 /* +00133 * Fill the section information block with information +00134 * from a Word for DOS file. +00135 */ +00136 static void +00137 vGet0SectionInfo(const UCHAR *aucGrpprl, size_t tBytes, +00138 section_block_type *pSection) +00139 { +00140 USHORT usCcol; +00141 UCHAR ucTmp; +00142 +00143 fail(aucGrpprl == NULL || pSection == NULL); +00144 +00145 if (tBytes < 2) { +00146 return; +00147 } +00148 /* bkc */ +00149 ucTmp = ucGetByte(1, aucGrpprl); +00150 DBG_HEX(ucTmp); +00151 ucTmp &= 0x07; +00152 DBG_HEX(ucTmp); +00153 pSection->bNewPage = ucTmp != 0 && ucTmp != 1; +00154 if (tBytes < 18) { +00155 return; +00156 } +00157 /* ccolM1 */ +00158 usCcol = (USHORT)ucGetByte(17, aucGrpprl); +00159 DBG_DEC(usCcol); +00160 } /* end of vGet0SectionInfo */ +00161 +00162 /* +00163 * Build the lists with Section Property Information for Word for DOS files +00164 */ +00165 void +00166 vGet0SepInfo(FILE *pFile, const UCHAR *aucHeader) +00167 { +00168 section_block_type tSection; +00169 UCHAR *aucBuffer; +00170 ULONG ulBeginOfText, ulTextOffset, ulBeginSectInfo; +00171 ULONG ulCharPos, ulSectPage, ulBeginNextBlock; +00172 size_t tSectInfoLen, tIndex, tSections, tBytes; +00173 UCHAR aucTmp[2], aucFpage[35]; +00174 +00175 fail(pFile == NULL || aucHeader == NULL); +00176 +00177 ulBeginOfText = 128; +00178 NO_DBG_HEX(ulBeginOfText); +00179 ulBeginSectInfo = 128 * (ULONG)usGetWord(0x18, aucHeader); +00180 DBG_HEX(ulBeginSectInfo); +00181 ulBeginNextBlock = 128 * (ULONG)usGetWord(0x1a, aucHeader); +00182 DBG_HEX(ulBeginNextBlock); +00183 if (ulBeginSectInfo == ulBeginNextBlock) { +00184 /* There is no section information block */ +00185 return; +00186 } +00187 +00188 /* Get the the number of sections */ +00189 if (!bReadBytes(aucTmp, 2, ulBeginSectInfo, pFile)) { +00190 return; +00191 } +00192 tSections = (size_t)usGetWord(0, aucTmp); +00193 NO_DBG_DEC(tSections); +00194 +00195 /* Read the Section Descriptors */ +00196 tSectInfoLen = 10 * tSections; +00197 NO_DBG_DEC(tSectInfoLen); +00198 aucBuffer = xmalloc(tSectInfoLen); +00199 if (!bReadBytes(aucBuffer, tSectInfoLen, ulBeginSectInfo + 4, pFile)) { +00200 aucBuffer = xfree(aucBuffer); +00201 return; +00202 } +00203 NO_DBG_PRINT_BLOCK(aucBuffer, tSectInfoLen); +00204 +00205 /* Read the Section Properties */ +00206 for (tIndex = 0; tIndex < tSections; tIndex++) { +00207 ulTextOffset = ulGetLong(10 * tIndex, aucBuffer); +00208 NO_DBG_HEX(ulTextOffset); +00209 ulCharPos = ulBeginOfText + ulTextOffset; +00210 NO_DBG_HEX(ulTextOffset); +00211 ulSectPage = ulGetLong(10 * tIndex + 6, aucBuffer); +00212 NO_DBG_HEX(ulSectPage); +00213 if (ulSectPage == FC_INVALID || /* Must use defaults */ +00214 ulSectPage < 128 || /* Should not happen */ +00215 ulSectPage >= ulBeginSectInfo) { /* Should not happen */ +00216 DBG_HEX_C(ulSectPage != FC_INVALID, ulSectPage); +00217 vDefault2SectionInfoList(ulCharPos); +00218 continue; +00219 } +00220 /* Get the number of bytes to read */ +00221 if (!bReadBytes(aucTmp, 1, ulSectPage, pFile)) { +00222 continue; +00223 } +00224 tBytes = 1 + (size_t)ucGetByte(0, aucTmp); +00225 NO_DBG_DEC(tBytes); +00226 if (tBytes > sizeof(aucFpage)) { +00227 DBG_DEC(tBytes); +00228 tBytes = sizeof(aucFpage); +00229 } +00230 /* Read the bytes */ +00231 if (!bReadBytes(aucFpage, tBytes, ulSectPage, pFile)) { +00232 continue; +00233 } +00234 NO_DBG_PRINT_BLOCK(aucFpage, tBytes); +00235 /* Process the bytes */ +00236 vGetDefaultSection(&tSection); +00237 vGet0SectionInfo(aucFpage + 1, tBytes - 1, &tSection); +00238 vAdd2SectionInfoList(&tSection, ulCharPos); +00239 } +00240 /* Clean up before you leave */ +00241 aucBuffer = xfree(aucBuffer); +00242 } /* end of vGet0SepInfo */ +00243 +00244 /* +00245 * Fill the style information block with information +00246 * from a Word for DOS file. +00247 */ +00248 static void +00249 vGet0StyleInfo(int iFodo, const UCHAR *aucGrpprl, style_block_type *pStyle) +00250 { +00251 int iBytes; +00252 UCHAR ucTmp; +00253 +00254 fail(iFodo <= 0 || aucGrpprl == NULL || pStyle == NULL); +00255 +00256 pStyle->usIstdNext = ISTD_NORMAL; +00257 +00258 iBytes = (int)ucGetByte(iFodo, aucGrpprl); +00259 if (iBytes < 1) { +00260 return; +00261 } +00262 /* stc if styled */ +00263 ucTmp = ucGetByte(iFodo + 1, aucGrpprl); +00264 if ((ucTmp & BIT(0)) != 0) { +00265 ucTmp >>= 1; +00266 if (ucTmp >= 88 && ucTmp <= 94) { +00267 /* Header levels 1 through 7 */ +00268 pStyle->usIstd = ucTmp - 87; +00269 pStyle->ucNumLevel = 1; +00270 } +00271 } +00272 if (iBytes < 2) { +00273 return; +00274 } +00275 /* jc */ +00276 ucTmp = ucGetByte(iFodo + 2, aucGrpprl); +00277 pStyle->ucAlignment = ucTmp & 0x02; +00278 if (iBytes < 3) { +00279 return; +00280 } +00281 /* stc */ +00282 ucTmp = ucGetByte(iFodo + 3, aucGrpprl); +00283 ucTmp &= 0x7f; +00284 if (ucTmp >= 88 && ucTmp <= 94) { +00285 /* Header levels 1 through 7 */ +00286 pStyle->usIstd = ucTmp - 87; +00287 pStyle->ucNumLevel = 1; +00288 } +00289 if (iBytes < 6) { +00290 return; +00291 } +00292 /* dxaRight */ +00293 pStyle->sRightIndent = (short)usGetWord(iFodo + 5, aucGrpprl); +00294 NO_DBG_DEC(pStyle->sRightIndent); +00295 if (iBytes < 8) { +00296 return; +00297 } +00298 /* dxaLeft */ +00299 pStyle->sLeftIndent = (short)usGetWord(iFodo + 7, aucGrpprl); +00300 NO_DBG_DEC(pStyle->sLeftIndent); +00301 if (iBytes < 10) { +00302 return; +00303 } +00304 /* dxaLeft1 */ +00305 pStyle->sLeftIndent1 = (short)usGetWord(iFodo + 9, aucGrpprl); +00306 NO_DBG_DEC(pStyle->sLeftIndent1); +00307 if (iBytes < 14) { +00308 return; +00309 } +00310 /* dyaBefore */ +00311 pStyle->usBeforeIndent = usGetWord(iFodo + 13, aucGrpprl); +00312 NO_DBG_DEC(pStyle->usBeforeIndent); +00313 if (iBytes < 16) { +00314 return; +00315 } +00316 /* dyaAfter */ +00317 pStyle->usAfterIndent = usGetWord(iFodo + 15, aucGrpprl); +00318 NO_DBG_DEC(pStyle->usAfterIndent); +00319 } /* end of vGet0StyleInfo */ +00320 +00321 /* +00322 * Build the lists with Paragraph Information for Word for DOS files +00323 */ +00324 void +00325 vGet0PapInfo(FILE *pFile, const UCHAR *aucHeader) +00326 { +00327 style_block_type tStyle; +00328 ULONG ulBeginParfInfo, ulCharPos, ulCharPosNext; +00329 int iIndex, iRun, iFodo; +00330 UCHAR aucFpage[128]; +00331 +00332 fail(pFile == NULL || aucHeader == NULL); +00333 +00334 ulBeginParfInfo = 128 * (ULONG)usGetWord(0x12, aucHeader); +00335 NO_DBG_HEX(ulBeginParfInfo); +00336 +00337 do { +00338 if (!bReadBytes(aucFpage, 128, ulBeginParfInfo, pFile)) { +00339 return; +00340 } +00341 NO_DBG_PRINT_BLOCK(aucFpage, 128); +00342 ulCharPosNext = ulGetLong(0, aucFpage); +00343 iRun = (int)ucGetByte(0x7f, aucFpage); +00344 NO_DBG_DEC(iRun); +00345 for (iIndex = 0; iIndex < iRun; iIndex++) { +00346 iFodo = (int)usGetWord(6 * iIndex + 8, aucFpage); +00347 if (iFodo <= 0 || iFodo > 0x79) { +00348 DBG_DEC_C(iFodo != (int)0xffff, iFodo); +00349 continue; +00350 } +00351 vFillStyleFromStylesheet(0, &tStyle); +00352 vGet0StyleInfo(iFodo, aucFpage + 4, &tStyle); +00353 ulCharPos = ulCharPosNext; +00354 ulCharPosNext = ulGetLong(6 * iIndex + 4, aucFpage); +00355 tStyle.ulFileOffset = ulCharPos; +00356 vAdd2StyleInfoList(&tStyle); +00357 } +00358 ulBeginParfInfo += 128; +00359 } while (ulCharPosNext == ulBeginParfInfo); +00360 } /* end of vGet0PapInfo */ +00361 +00362 /* +00363 * Fill the font information block with information +00364 * from a Word for DOS file. +00365 */ +00366 static void +00367 vGet0FontInfo(int iFodo, const UCHAR *aucGrpprl, font_block_type *pFont) +00368 { +00369 int iBytes; +00370 UCHAR ucTmp; +00371 +00372 fail(iFodo <= 0 || aucGrpprl == NULL || pFont == NULL); +00373 +00374 iBytes = (int)ucGetByte(iFodo, aucGrpprl); +00375 if (iBytes < 2) { +00376 return; +00377 } +00378 /* fBold, fItalic, cFtc */ +00379 ucTmp = ucGetByte(iFodo + 2, aucGrpprl); +00380 if ((ucTmp & BIT(0)) != 0) { +00381 pFont->usFontStyle |= FONT_BOLD; +00382 } +00383 if ((ucTmp & BIT(1)) != 0) { +00384 pFont->usFontStyle |= FONT_ITALIC; +00385 } +00386 pFont->ucFontNumber = ucTmp >> 2; +00387 NO_DBG_DEC(pFont->ucFontNumber); +00388 if (iBytes < 3) { +00389 return; +00390 } +00391 /* cHps */ +00392 pFont->usFontSize = (USHORT)ucGetByte(iFodo + 3, aucGrpprl); +00393 NO_DBG_DEC(pFont->usFontSize); +00394 if (iBytes < 4) { +00395 return; +00396 } +00397 /* cKul, fStrike, fCaps, fSmallCaps, fVanish */ +00398 ucTmp = ucGetByte(iFodo + 4, aucGrpprl); +00399 if ((ucTmp & BIT(0)) != 0 || (ucTmp & BIT(2)) != 0) { +00400 pFont->usFontStyle |= FONT_UNDERLINE; +00401 } +00402 if ((ucTmp & BIT(1)) != 0) { +00403 pFont->usFontStyle |= FONT_STRIKE; +00404 } +00405 if ((ucTmp & BIT(4)) != 0) { +00406 pFont->usFontStyle |= FONT_CAPITALS; +00407 } +00408 if ((ucTmp & BIT(5)) != 0) { +00409 pFont->usFontStyle |= FONT_SMALL_CAPITALS; +00410 } +00411 if ((ucTmp & BIT(7)) != 0) { +00412 pFont->usFontStyle |= FONT_HIDDEN; +00413 } +00414 DBG_HEX(pFont->usFontStyle); +00415 if (iBytes < 6) { +00416 return; +00417 } +00418 /* cIss */ +00419 ucTmp = ucGetByte(iFodo + 6, aucGrpprl); +00420 if (ucTmp != 0) { +00421 if (ucTmp < 128) { +00422 pFont->usFontStyle |= FONT_SUPERSCRIPT; +00423 DBG_MSG("Superscript"); +00424 } else { +00425 pFont->usFontStyle |= FONT_SUBSCRIPT; +00426 DBG_MSG("Subscript"); +00427 } +00428 } +00429 if (iBytes < 7) { +00430 return; +00431 } +00432 /* cIco */ +00433 ucTmp = ucGetByte(iFodo + 7, aucGrpprl); +00434 switch (ucTmp & 0x07) { +00435 case 0: pFont->ucFontColor = FONT_COLOR_BLACK; break; +00436 case 1: pFont->ucFontColor = FONT_COLOR_RED; break; +00437 case 2: pFont->ucFontColor = FONT_COLOR_GREEN; break; +00438 case 3: pFont->ucFontColor = FONT_COLOR_BLUE; break; +00439 case 4: pFont->ucFontColor = FONT_COLOR_CYAN; break; +00440 case 5: pFont->ucFontColor = FONT_COLOR_MAGENTA; break; +00441 case 6: pFont->ucFontColor = FONT_COLOR_YELLOW; break; +00442 case 7: pFont->ucFontColor = FONT_COLOR_WHITE; break; +00443 default:pFont->ucFontColor = FONT_COLOR_BLACK; break; +00444 } +00445 NO_DBG_DEC(pFont->ucFontColor); +00446 } /* end of vGet0FontInfo */ +00447 +00448 /* +00449 * Build the lists with Character Information for Word for DOS files +00450 */ +00451 void +00452 vGet0ChrInfo(FILE *pFile, const UCHAR *aucHeader) +00453 { +00454 font_block_type tFont; +00455 ULONG ulBeginCharInfo, ulCharPos, ulCharPosNext; +00456 int iIndex, iRun, iFodo; +00457 UCHAR aucFpage[128]; +00458 +00459 fail(pFile == NULL || aucHeader == NULL); +00460 +00461 ulBeginCharInfo = ulGetLong(0x0e, aucHeader); +00462 NO_DBG_HEX(ulBeginCharInfo); +00463 ulBeginCharInfo = ROUND128(ulBeginCharInfo); +00464 NO_DBG_HEX(ulBeginCharInfo); +00465 +00466 do { +00467 if (!bReadBytes(aucFpage, 128, ulBeginCharInfo, pFile)) { +00468 return; +00469 } +00470 NO_DBG_PRINT_BLOCK(aucFpage, 128); +00471 ulCharPosNext = ulGetLong(0, aucFpage); +00472 iRun = (int)ucGetByte(0x7f, aucFpage); +00473 NO_DBG_DEC(iRun); +00474 for (iIndex = 0; iIndex < iRun; iIndex++) { +00475 iFodo = (int)usGetWord(6 * iIndex + 8, aucFpage); +00476 if (iFodo <= 0 || iFodo > 0x79) { +00477 DBG_DEC_C(iFodo != (int)0xffff, iFodo); +00478 continue; +00479 } +00480 vFillFontFromStylesheet(0, &tFont); +00481 vGet0FontInfo(iFodo, aucFpage + 4, &tFont); +00482 ulCharPos = ulCharPosNext; +00483 ulCharPosNext = ulGetLong(6 * iIndex + 4, aucFpage); +00484 tFont.ulFileOffset = ulCharPos; +00485 vAdd2FontInfoList(&tFont); +00486 } +00487 ulBeginCharInfo += 128; +00488 } while (ulCharPosNext == ulBeginCharInfo); +00489 } /* end of vGet0ChrInfo */ +