diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/stylesheet_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/stylesheet_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,854 @@ + + +
+ +00001 /* +00002 * stylesheet.c +00003 * Copyright (C) 2001-2004 A.J. van Os; Released under GNU GPL +00004 * +00005 * Description: +00006 * Build, read and destroy a list of stylesheet information +00007 * +00008 */ +00009 +00010 #include <string.h> +00011 #include "antiword.h" +00012 +00013 +00014 #define SGC_PAP 1 +00015 #define SGC_CHP 2 +00016 +00017 /* Variables needed to describe the stylesheet list */ +00018 static style_block_type *atStyleInfo = NULL; +00019 static font_block_type *atFontInfo = NULL; +00020 static BOOL *abFilled = NULL; +00021 static size_t tStdCount = 0; +00022 +00023 +00024 /* +00025 * vDestroyStylesheetList - destroy the stylesheet list +00026 */ +00027 void +00028 vDestroyStylesheetList(void) +00029 { +00030 DBG_MSG("vDestroyStylesheetList"); +00031 +00032 tStdCount = 0; +00033 atStyleInfo = xfree(atStyleInfo); +00034 atFontInfo = xfree(atFontInfo); +00035 abFilled = xfree(abFilled); +00036 } /* end of vDestroyStylesheetList */ +00037 +00038 /* +00039 * vGetDefaultStyle - fill the style struct with default values +00040 */ +00041 static void +00042 vGetDefaultStyle(style_block_type *pStyle) +00043 { +00044 (void)memset(pStyle, 0, sizeof(*pStyle)); +00045 pStyle->usIstd = ISTD_INVALID; +00046 pStyle->usIstdNext = ISTD_INVALID; +00047 pStyle->usStartAt = 1; +00048 pStyle->ucListLevel = 9; +00049 } /* end of vGetDefaultStyle */ +00050 +00051 /* +00052 * vGetDefaultFont - fill the font struct with default values +00053 */ +00054 static void +00055 vGetDefaultFont(font_block_type *pFont, USHORT usDefaultFontNumber) +00056 { +00057 (void)memset(pFont, 0, sizeof(*pFont)); +00058 pFont->usFontSize = DEFAULT_FONT_SIZE; +00059 if (usDefaultFontNumber <= (USHORT)UCHAR_MAX) { +00060 pFont->ucFontNumber = (UCHAR)usDefaultFontNumber; +00061 } else { +00062 DBG_DEC(usDefaultFontNumber); +00063 DBG_FIXME(); +00064 pFont->ucFontNumber = 0; +00065 } +00066 } /* end of vGetDefaultFont */ +00067 +00068 /* +00069 * iGetStyleIndex - get the index of the record with the specified istd +00070 * +00071 * returns the index when found, otherwise -1 +00072 */ +00073 static int +00074 iGetStyleIndex(USHORT usIstd) +00075 { +00076 int iIndex; +00077 +00078 fail(abFilled == NULL); +00079 +00080 if (usIstd == ISTD_INVALID || abFilled == NULL) { +00081 return -1; +00082 } +00083 +00084 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00085 if (abFilled[iIndex] && atStyleInfo[iIndex].usIstd == usIstd) { +00086 /* The record is filled and the istd matches */ +00087 return iIndex; +00088 } +00089 } +00090 return -1; +00091 } /* end of iGetStyleIndex */ +00092 +00093 /* +00094 * Get a build-in style for Winword 1/2 +00095 */ +00096 static void +00097 vGetBuildinStyle(UCHAR ucStc, style_block_type *pStyle) +00098 { +00099 fail(pStyle == NULL); +00100 +00101 /* Start with de defaults */ +00102 vGetDefaultStyle(pStyle); +00103 +00104 /* Add the build-in style info */ +00105 switch (ucStc) { +00106 case 246: +00107 case 247: +00108 case 248: +00109 case 249: +00110 case 250: +00111 case 255: +00112 pStyle->sLeftIndent = 720; +00113 break; +00114 case 251: +00115 case 252: +00116 pStyle->sLeftIndent = 360; +00117 break; +00118 case 253: +00119 pStyle->usBeforeIndent = 120; +00120 break; +00121 case 254: +00122 pStyle->usBeforeIndent = 240; +00123 break; +00124 default: +00125 if (ucStc >= 233 && ucStc <= 239) { +00126 pStyle->sLeftIndent = (239 - (short)ucStc) * 360; +00127 } +00128 if (ucStc >= 225 && ucStc <= 232) { +00129 pStyle->sLeftIndent = (232 - (short)ucStc) * 720; +00130 pStyle->sRightIndent = 720; +00131 } +00132 break; +00133 } +00134 } /* end of vGetBuildinStyle */ +00135 +00136 /* +00137 * Get a build-in fontstyle for Winword 1/2 +00138 */ +00139 static void +00140 vGetBuildinFont(UCHAR ucStc, font_block_type *pFont) +00141 { +00142 fail(pFont == NULL); +00143 +00144 /* Start with de defaults */ +00145 vGetDefaultFont(pFont, 0); +00146 +00147 /* Add the build-in fontstyle info */ +00148 switch (ucStc) { +00149 case 223: +00150 case 244: +00151 pFont->usFontSize = 16; +00152 break; +00153 case 246: +00154 case 247: +00155 case 248: +00156 pFont->usFontStyle |= FONT_ITALIC; +00157 break; +00158 case 249: +00159 pFont->usFontStyle |= FONT_UNDERLINE; +00160 break; +00161 case 250: +00162 pFont->usFontStyle |= FONT_BOLD; +00163 break; +00164 case 251: +00165 pFont->usFontStyle |= FONT_UNDERLINE; +00166 pFont->usFontSize = 24; +00167 break; +00168 case 252: +00169 pFont->usFontStyle |= FONT_BOLD; +00170 pFont->usFontSize = 24; +00171 break; +00172 case 253: +00173 pFont->ucFontNumber = 2; +00174 pFont->usFontStyle |= FONT_BOLD; +00175 pFont->usFontSize = 24; +00176 break; +00177 case 254: +00178 pFont->ucFontNumber = 2; +00179 pFont->usFontStyle |= (FONT_BOLD|FONT_UNDERLINE); +00180 pFont->usFontSize = 24; +00181 break; +00182 default: +00183 break; +00184 } +00185 } /* end of vGetBuildinFont */ +00186 +00187 /* +00188 * Convert a stylecode (stc) as used by WinWord 1/2 into a styleindex (istd) +00189 * as used by Word 6 and up +00190 */ +00191 USHORT +00192 usStc2istd(UCHAR ucStc) +00193 { +00194 /* Old nil style to new nil style */ +00195 if (ucStc == 222) { +00196 return STI_NIL; +00197 } +00198 +00199 /* Heading 1 through 9 must become istd 1 through 9 */ +00200 /* so 254 through 246 must become 1 through 9 and vice versa */ +00201 if ((ucStc >= 1 && ucStc <= 9) || +00202 (ucStc >= 246 && ucStc <= 254)) { +00203 return 255 - (USHORT)ucStc; +00204 } +00205 return (USHORT)ucStc; +00206 } /* end of usStd2istd */ +00207 +00208 /* +00209 * Build the lists with Stylesheet Information for WinWord 1/2 files +00210 */ +00211 void +00212 vGet2Stylesheet(FILE *pFile, int iWordVersion, const UCHAR *aucHeader) +00213 { +00214 style_block_type *pStyle; +00215 font_block_type *pFont; +00216 UCHAR *aucBuffer; +00217 ULONG ulBeginStshInfo; +00218 size_t tStshInfoLen, tName, tChpx, tPapx, tMaxIndex; +00219 int iStIndex, iChpxIndex, iPapxIndex, iSt, iChpx, iPapx; +00220 int iStd, iIndex, iBaseStyleIndex, iCounter; +00221 USHORT usBaseStyle; +00222 UCHAR ucStc, ucStcNext, ucStcBase; +00223 +00224 fail(pFile == NULL || aucHeader == NULL); +00225 fail(iWordVersion != 1 && iWordVersion != 2); +00226 +00227 ulBeginStshInfo = ulGetLong(0x5e, aucHeader); /* fcStshf */ +00228 NO_DBG_HEX(ulBeginStshInfo); +00229 tStshInfoLen = (size_t)usGetWord(0x62, aucHeader); /* cbStshf */ +00230 NO_DBG_DEC(tStshInfoLen); +00231 +00232 aucBuffer = xmalloc(tStshInfoLen); +00233 if (!bReadBytes(aucBuffer, tStshInfoLen, ulBeginStshInfo, pFile)) { +00234 aucBuffer = xfree(aucBuffer); +00235 return; +00236 } +00237 NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen); +00238 +00239 fail(2 > tStshInfoLen); +00240 iStd = (int)usGetWord(0, aucBuffer); +00241 +00242 fail(2 + 2 > tStshInfoLen); +00243 tName = (size_t)usGetWord(2, aucBuffer); +00244 +00245 fail(2 + tName + 2 > tStshInfoLen); +00246 tChpx = (size_t)usGetWord(2 + tName, aucBuffer); +00247 +00248 fail(2 + tName + tChpx + 2 > tStshInfoLen); +00249 tPapx = (size_t)usGetWord(2 + tName + tChpx, aucBuffer); +00250 +00251 fail(2 + tName + tChpx + tPapx + 2 > tStshInfoLen); +00252 tStdCount = (size_t)usGetWord(2 + tName + tChpx + tPapx, aucBuffer); +00253 +00254 NO_DBG_HEX(tStdCount); +00255 +00256 atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); +00257 atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); +00258 abFilled = xcalloc(tStdCount, sizeof(BOOL)); +00259 +00260 do { +00261 iCounter = 0; +00262 iStIndex = 2 + 2; +00263 iChpxIndex = 2 + (int)tName + 2; +00264 iPapxIndex = 2 + (int)tName + (int)tChpx + 2; +00265 tMaxIndex = 2 + tName + tChpx + tPapx + 2; +00266 /* Read the styles one-by-one */ +00267 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00268 pStyle = &atStyleInfo[iIndex]; +00269 pFont = &atFontInfo[iIndex]; +00270 iSt = (int)ucGetByte(iStIndex, aucBuffer); +00271 iChpx = (int)ucGetByte(iChpxIndex, aucBuffer); +00272 iPapx = (int)ucGetByte(iPapxIndex, aucBuffer); +00273 NO_DBG_HEX(iSt); +00274 NO_DBG_HEX(iChpx); +00275 NO_DBG_HEX(iPapx); +00276 if (iSt == 0xff || tMaxIndex + 1 >= tStshInfoLen) { +00277 /* Undefined style or no information */ +00278 iStIndex++; +00279 iChpxIndex++; +00280 iPapxIndex++; +00281 tMaxIndex += 2; +00282 if (!abFilled[iIndex]) { +00283 DBG_HEX_C(iChpx != 0xff, iChpx); +00284 DBG_HEX_C(iPapx != 0xff, iPapx); +00285 vGetDefaultStyle(pStyle); +00286 vGetDefaultFont(pFont, 0); +00287 abFilled[iIndex] = TRUE; +00288 } +00289 continue; +00290 } +00291 +00292 NO_DBG_STRN(aucBuffer + iStIndex + 1, iSt); +00293 iStIndex += iSt + 1; +00294 +00295 ucStcNext = ucGetByte(tMaxIndex, aucBuffer); +00296 ucStcBase = ucGetByte(tMaxIndex + 1, aucBuffer); +00297 ucStc = (UCHAR)((iIndex - iStd) & 0xff); +00298 NO_DBG_DEC(ucStc); +00299 +00300 if (iChpx == 0xff || iPapx == 0xff) { +00301 /* Use a build-in style */ +00302 iChpxIndex++; +00303 iPapxIndex++; +00304 tMaxIndex += 2; +00305 if (!abFilled[iIndex]) { +00306 DBG_HEX_C(iChpx != 0xff, iChpx); +00307 DBG_HEX_C(iPapx != 0xff, iPapx); +00308 vGetBuildinStyle(ucStc, pStyle); +00309 pStyle->usIstd = usStc2istd(ucStc); +00310 pStyle->usIstdNext = +00311 usStc2istd(ucStcNext); +00312 vGetBuildinFont(ucStc, pFont); +00313 abFilled[iIndex] = TRUE; +00314 } +00315 continue; +00316 } +00317 +00318 if (abFilled[iIndex]) { +00319 /* This record has already been filled */ +00320 iChpxIndex += iChpx + 1; +00321 iPapxIndex += iPapx + 1; +00322 tMaxIndex += 2; +00323 continue; +00324 } +00325 +00326 usBaseStyle = usStc2istd(ucStcBase); +00327 +00328 if (usBaseStyle == STI_NIL) { +00329 /* Based on the Nil style */ +00330 vGetDefaultStyle(pStyle); +00331 vGetDefaultFont(pFont, 0); +00332 } else { +00333 iBaseStyleIndex = iGetStyleIndex(usBaseStyle); +00334 NO_DBG_DEC(iBaseStyleIndex); +00335 if (iBaseStyleIndex < 0) { +00336 /* This style is not known yet */ +00337 iChpxIndex += iChpx + 1; +00338 iPapxIndex += iPapx + 1; +00339 tMaxIndex += 2; +00340 continue; +00341 } +00342 fail(iBaseStyleIndex >= (int)tStdCount); +00343 fail(!abFilled[iBaseStyleIndex]); +00344 /* Based on the specified base style */ +00345 *pStyle = atStyleInfo[iBaseStyleIndex]; +00346 *pFont = atFontInfo[iBaseStyleIndex]; +00347 } +00348 pStyle->usIstd = usStc2istd(ucStc); +00349 pStyle->usIstdNext = usStc2istd(ucStcNext); +00350 +00351 abFilled[iIndex] = TRUE; +00352 iCounter++; +00353 +00354 /* Add the changes if any */ +00355 switch (iChpx) { +00356 case 0x00: +00357 case 0xff: +00358 iChpxIndex++; +00359 break; +00360 default: +00361 NO_DBG_PRINT_BLOCK(aucBuffer + iChpxIndex + 1, +00362 iChpx); +00363 if (iWordVersion == 1) { +00364 vGet1FontInfo(0, +00365 aucBuffer + iChpxIndex + 1, +00366 (size_t)iChpx, pFont); +00367 } else { +00368 vGet2FontInfo(0, +00369 aucBuffer + iChpxIndex + 1, +00370 (size_t)iChpx, pFont); +00371 } +00372 iChpxIndex += iChpx + 1; +00373 break; +00374 } +00375 +00376 switch (iPapx) { +00377 case 0x00: +00378 case 0xff: +00379 iPapxIndex++; +00380 break; +00381 default: +00382 NO_DBG_PRINT_BLOCK(aucBuffer + iPapxIndex + 8, +00383 iPapx - 7); +00384 vGet2StyleInfo(0, aucBuffer + iPapxIndex + 8, +00385 iPapx - 7, pStyle); +00386 iPapxIndex += iPapx + 1; +00387 break; +00388 } +00389 tMaxIndex += 2; +00390 +00391 } +00392 NO_DBG_DEC(iCounter); +00393 } while (iCounter > 0); +00394 +00395 /* Fill records that are still empty */ +00396 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00397 if (!abFilled[iIndex]) { +00398 NO_DBG_DEC(iIndex); +00399 vGetDefaultStyle(&atStyleInfo[iIndex]); +00400 vGetDefaultFont(&atFontInfo[iIndex], 0); +00401 } +00402 } +00403 +00404 /* Clean up before you leave */ +00405 abFilled = xfree(abFilled); +00406 aucBuffer = xfree(aucBuffer); +00407 } /* end of vGet2Stylesheet */ +00408 +00409 /* +00410 * Build the lists with Stylesheet Information for Word 6/7 files +00411 */ +00412 void +00413 vGet6Stylesheet(FILE *pFile, ULONG ulStartBlock, +00414 const ULONG *aulBBD, size_t tBBDLen, const UCHAR *aucHeader) +00415 { +00416 style_block_type *pStyle; +00417 font_block_type *pFont; +00418 UCHAR *aucBuffer; +00419 ULONG ulBeginStshInfo; +00420 size_t tStshInfoLen, tOffset, tStdLen, tStdBaseInFile; +00421 size_t tPos, tNameLen, tUpxLen; +00422 int iIndex, iBaseStyleIndex, iCounter; +00423 USHORT usTmp, usUpxCount, usStyleType, usBaseStyle; +00424 USHORT usFtcStandardChpStsh; +00425 +00426 fail(pFile == NULL || aucHeader == NULL); +00427 fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN); +00428 fail(aulBBD == NULL); +00429 +00430 ulBeginStshInfo = ulGetLong(0x60, aucHeader); /* fcStshf */ +00431 NO_DBG_HEX(ulBeginStshInfo); +00432 tStshInfoLen = (size_t)ulGetLong(0x64, aucHeader); /* lcbStshf */ +00433 NO_DBG_DEC(tStshInfoLen); +00434 +00435 aucBuffer = xmalloc(tStshInfoLen); +00436 if (!bReadBuffer(pFile, ulStartBlock, +00437 aulBBD, tBBDLen, BIG_BLOCK_SIZE, +00438 aucBuffer, ulBeginStshInfo, tStshInfoLen)) { +00439 aucBuffer = xfree(aucBuffer); +00440 return; +00441 } +00442 NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen); +00443 +00444 tStdCount = (size_t)usGetWord(2, aucBuffer); +00445 NO_DBG_DEC(tStdCount); +00446 tStdBaseInFile = (size_t)usGetWord(4, aucBuffer); +00447 usFtcStandardChpStsh = usGetWord(14, aucBuffer); +00448 NO_DBG_DEC(usFtcStandardChpStsh); +00449 +00450 atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); +00451 atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); +00452 abFilled = xcalloc(tStdCount, sizeof(BOOL)); +00453 +00454 do { +00455 iCounter = 0; +00456 /* Read the styles one-by-one */ +00457 for (iIndex = 0, tOffset = 2 + (size_t)usGetWord(0, aucBuffer); +00458 iIndex < (int)tStdCount; +00459 iIndex++, tOffset += 2 + tStdLen) { +00460 NO_DBG_DEC(tOffset); +00461 tStdLen = (size_t)usGetWord(tOffset, aucBuffer); +00462 NO_DBG_DEC(tStdLen); +00463 if (abFilled[iIndex]) { +00464 /* This record has already been filled */ +00465 continue; +00466 } +00467 pStyle = &atStyleInfo[iIndex]; +00468 pFont = &atFontInfo[iIndex]; +00469 if (tStdLen == 0) { +00470 /* Empty record */ +00471 vGetDefaultStyle(pStyle); +00472 vGetDefaultFont(pFont, usFtcStandardChpStsh); +00473 abFilled[iIndex] = TRUE; +00474 continue; +00475 } +00476 usTmp = usGetWord(tOffset + 4, aucBuffer); +00477 usStyleType = usTmp % 16; +00478 usBaseStyle = usTmp / 16; +00479 NO_DBG_DEC(usStyleType); +00480 NO_DBG_DEC(usBaseStyle); +00481 if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) { +00482 /* Based on the Nil style */ +00483 vGetDefaultStyle(pStyle); +00484 vGetDefaultFont(pFont, usFtcStandardChpStsh); +00485 } else { +00486 iBaseStyleIndex = iGetStyleIndex(usBaseStyle); +00487 NO_DBG_DEC(iBaseStyleIndex); +00488 if (iBaseStyleIndex < 0) { +00489 /* This base style is not known yet */ +00490 continue; +00491 } +00492 fail(iBaseStyleIndex >= (int)tStdCount); +00493 fail(!abFilled[iBaseStyleIndex]); +00494 /* Based on the specified base style */ +00495 *pStyle = atStyleInfo[iBaseStyleIndex]; +00496 pStyle->usIstd = ISTD_INVALID; +00497 *pFont = atFontInfo[iBaseStyleIndex]; +00498 } +00499 abFilled[iIndex] = TRUE; +00500 iCounter++; +00501 /* STD */ +00502 usTmp = usGetWord(tOffset + 6, aucBuffer); +00503 usUpxCount = usTmp % 16; +00504 pStyle->usIstdNext = usTmp / 16;; +00505 NO_DBG_DEC(usUpxCount); +00506 tPos = 2 + tStdBaseInFile; +00507 NO_DBG_DEC(tPos); +00508 tNameLen = (size_t)ucGetByte(tOffset + tPos, aucBuffer); +00509 NO_DBG_DEC(tNameLen); +00510 NO_DBG_STRN(aucBuffer + tOffset + tPos + 1, tNameLen); +00511 tNameLen++; /* Include the ASCII NULL character */ +00512 tPos += 1 + tNameLen; +00513 if (odd(tPos)) { +00514 tPos++; +00515 } +00516 NO_DBG_DEC(tPos); +00517 if (tPos >= tStdLen) { +00518 continue; +00519 } +00520 tUpxLen = (size_t)usGetWord(tOffset + tPos, aucBuffer); +00521 NO_DBG_DEC(tUpxLen); +00522 if (tPos + tUpxLen > tStdLen) { +00523 /* UPX length too large to be a record */ +00524 DBG_DEC_C(tPos + tUpxLen > tStdLen, +00525 tPos + tUpxLen); +00526 continue; +00527 } +00528 if (usStyleType == SGC_PAP && usUpxCount >= 1) { +00529 if (tUpxLen >= 2) { +00530 NO_DBG_PRINT_BLOCK( +00531 aucBuffer + tOffset + tPos + 2, +00532 tUpxLen); +00533 pStyle->usIstd = usGetWord( +00534 tOffset + tPos + 2, aucBuffer); +00535 NO_DBG_DEC(pStyle->usIstd); +00536 NO_DBG_DEC(pStyle->usIstdNext); +00537 vGet6StyleInfo(0, +00538 aucBuffer + tOffset + tPos + 4, +00539 tUpxLen - 2, pStyle); +00540 NO_DBG_DEC(pStyle->sLeftIndent); +00541 NO_DBG_DEC(pStyle->sRightIndent); +00542 NO_DBG_HEX(pStyle->ucAlignment); +00543 } +00544 tPos += 2 + tUpxLen; +00545 if (odd(tPos)) { +00546 tPos++; +00547 } +00548 NO_DBG_DEC(tPos); +00549 tUpxLen = (size_t)usGetWord( +00550 tOffset + tPos, aucBuffer); +00551 NO_DBG_DEC(tUpxLen); +00552 } +00553 if (tUpxLen == 0 || tPos + tUpxLen > tStdLen) { +00554 /* Too small or too large to be a record */ +00555 DBG_DEC_C(tPos + tUpxLen > tStdLen, +00556 tPos + tUpxLen); +00557 continue; +00558 } +00559 if ((usStyleType == SGC_PAP && usUpxCount >= 2) || +00560 (usStyleType == SGC_CHP && usUpxCount >= 1)) { +00561 NO_DBG_PRINT_BLOCK( +00562 aucBuffer + tOffset + tPos + 2, +00563 tUpxLen); +00564 vGet6FontInfo(0, ISTD_INVALID, +00565 aucBuffer + tOffset + tPos + 2, +00566 (int)tUpxLen, pFont); +00567 NO_DBG_DEC(pFont->usFontSize); +00568 NO_DBG_DEC(pFont->ucFontcolor); +00569 NO_DBG_HEX(pFont->usFontStyle); +00570 } +00571 } +00572 NO_DBG_DEC(iCounter); +00573 } while (iCounter > 0); +00574 +00575 /* Fill records that are still empty */ +00576 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00577 if (!abFilled[iIndex]) { +00578 NO_DBG_DEC(iIndex); +00579 vGetDefaultStyle(&atStyleInfo[iIndex]); +00580 vGetDefaultFont(&atFontInfo[iIndex], +00581 usFtcStandardChpStsh); +00582 } +00583 } +00584 +00585 /* Clean up before you leave */ +00586 abFilled = xfree(abFilled); +00587 aucBuffer = xfree(aucBuffer); +00588 } /* end of vGet6Stylesheet */ +00589 +00590 /* +00591 * Build the lists with Stylesheet Information for Word 8/9/10 files +00592 */ +00593 void +00594 vGet8Stylesheet(FILE *pFile, const pps_info_type *pPPS, +00595 const ULONG *aulBBD, size_t tBBDLen, +00596 const ULONG *aulSBD, size_t tSBDLen, +00597 const UCHAR *aucHeader) +00598 { +00599 style_block_type *pStyle; +00600 font_block_type *pFont; +00601 const ULONG *aulBlockDepot; +00602 UCHAR *aucBuffer; +00603 ULONG ulBeginStshInfo; +00604 size_t tStshInfoLen, tBlockDepotLen, tOffset, tStdLen, tStdBaseInFile; +00605 size_t tBlockSize, tPos, tNameLen, tUpxLen; +00606 int iIndex, iBaseStyleIndex, iCounter; +00607 USHORT usTmp, usUpxCount, usStyleType, usBaseStyle; +00608 USHORT usFtcStandardChpStsh; +00609 +00610 fail(pFile == NULL || pPPS == NULL || aucHeader == NULL); +00611 fail(aulBBD == NULL || aulSBD == NULL); +00612 +00613 ulBeginStshInfo = ulGetLong(0xa2, aucHeader); /* fcStshf */ +00614 NO_DBG_HEX(ulBeginStshInfo); +00615 tStshInfoLen = (size_t)ulGetLong(0xa6, aucHeader); /* lcbStshf */ +00616 NO_DBG_DEC(tStshInfoLen); +00617 +00618 NO_DBG_DEC(pPPS->tTable.ulSB); +00619 NO_DBG_HEX(pPPS->tTable.ulSize); +00620 if (pPPS->tTable.ulSize == 0) { +00621 DBG_MSG("No stylesheet information"); +00622 return; +00623 } +00624 +00625 if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) { +00626 /* Use the Small Block Depot */ +00627 aulBlockDepot = aulSBD; +00628 tBlockDepotLen = tSBDLen; +00629 tBlockSize = SMALL_BLOCK_SIZE; +00630 } else { +00631 /* Use the Big Block Depot */ +00632 aulBlockDepot = aulBBD; +00633 tBlockDepotLen = tBBDLen; +00634 tBlockSize = BIG_BLOCK_SIZE; +00635 } +00636 aucBuffer = xmalloc(tStshInfoLen); +00637 if (!bReadBuffer(pFile, pPPS->tTable.ulSB, +00638 aulBlockDepot, tBlockDepotLen, tBlockSize, +00639 aucBuffer, ulBeginStshInfo, tStshInfoLen)) { +00640 aucBuffer = xfree(aucBuffer); +00641 return; +00642 } +00643 NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen); +00644 +00645 tStdCount = (size_t)usGetWord(2, aucBuffer); +00646 NO_DBG_DEC(tStdCount); +00647 tStdBaseInFile = (size_t)usGetWord(4, aucBuffer); +00648 usFtcStandardChpStsh = usGetWord(14, aucBuffer); +00649 NO_DBG_DEC(usFtcStandardChpStsh); +00650 +00651 atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type)); +00652 atFontInfo = xcalloc(tStdCount, sizeof(font_block_type)); +00653 abFilled = xcalloc(tStdCount, sizeof(BOOL)); +00654 +00655 do { +00656 iCounter = 0; +00657 /* Read the styles one-by-one */ +00658 for (iIndex = 0, tOffset = 2 + (size_t)usGetWord(0, aucBuffer); +00659 iIndex < (int)tStdCount; +00660 iIndex++, tOffset += 2 + tStdLen) { +00661 NO_DBG_DEC(tOffset); +00662 tStdLen = (size_t)usGetWord(tOffset, aucBuffer); +00663 NO_DBG_DEC(tStdLen); +00664 if (abFilled[iIndex]) { +00665 /* This record has already been filled */ +00666 continue; +00667 } +00668 pStyle = &atStyleInfo[iIndex]; +00669 pFont = &atFontInfo[iIndex]; +00670 if (tStdLen == 0) { +00671 /* Empty record */ +00672 vGetDefaultStyle(pStyle); +00673 vGetDefaultFont(pFont, usFtcStandardChpStsh); +00674 abFilled[iIndex] = TRUE; +00675 continue; +00676 } +00677 usTmp = usGetWord(tOffset + 4, aucBuffer); +00678 usStyleType = usTmp % 16; +00679 usBaseStyle = usTmp / 16; +00680 NO_DBG_DEC(usStyleType); +00681 NO_DBG_DEC(usBaseStyle); +00682 if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) { +00683 /* Based on the Nil style */ +00684 vGetDefaultStyle(pStyle); +00685 vGetDefaultFont(pFont, usFtcStandardChpStsh); +00686 } else { +00687 iBaseStyleIndex = iGetStyleIndex(usBaseStyle); +00688 NO_DBG_DEC(iBaseStyleIndex); +00689 if (iBaseStyleIndex < 0) { +00690 /* This base style is not known yet */ +00691 continue; +00692 } +00693 fail(iBaseStyleIndex >= (int)tStdCount); +00694 fail(!abFilled[iBaseStyleIndex]); +00695 /* Based on the specified base style */ +00696 *pStyle = atStyleInfo[iBaseStyleIndex]; +00697 pStyle->usIstd = ISTD_INVALID; +00698 *pFont = atFontInfo[iBaseStyleIndex]; +00699 } +00700 abFilled[iIndex] = TRUE; +00701 iCounter++; +00702 /* STD */ +00703 usTmp = usGetWord(tOffset + 6, aucBuffer); +00704 usUpxCount = usTmp % 16; +00705 pStyle->usIstdNext = usTmp / 16; +00706 NO_DBG_DEC(usUpxCount); +00707 tPos = 2 + tStdBaseInFile; +00708 NO_DBG_DEC(tPos); +00709 tNameLen = (size_t)usGetWord(tOffset + tPos, aucBuffer); +00710 NO_DBG_DEC(tNameLen); +00711 tNameLen *= 2; /* From Unicode characters to bytes */ +00712 NO_DBG_UNICODE_N(aucBuffer + tOffset + tPos + 2, +00713 tNameLen); +00714 tNameLen += 2; /* Include the Unicode NULL character */ +00715 tPos += 2 + tNameLen; +00716 if (odd(tPos)) { +00717 tPos++; +00718 } +00719 NO_DBG_DEC(tPos); +00720 if (tPos >= tStdLen) { +00721 continue; +00722 } +00723 tUpxLen = (size_t)usGetWord(tOffset + tPos, aucBuffer); +00724 NO_DBG_DEC(tUpxLen); +00725 if (tPos + tUpxLen > tStdLen) { +00726 /* UPX length too large to be a record */ +00727 DBG_DEC_C(tPos + tUpxLen > tStdLen, +00728 tPos + tUpxLen); +00729 continue; +00730 } +00731 if (usStyleType == SGC_PAP && usUpxCount >= 1) { +00732 if (tUpxLen >= 2) { +00733 NO_DBG_PRINT_BLOCK( +00734 aucBuffer + tOffset + tPos + 2, +00735 tUpxLen); +00736 pStyle->usIstd = usGetWord( +00737 tOffset + tPos + 2, aucBuffer); +00738 NO_DBG_DEC(pStyle->usIstd); +00739 NO_DBG_DEC(pStyle->usIstdNext); +00740 vGet8StyleInfo(0, +00741 aucBuffer + tOffset + tPos + 4, +00742 tUpxLen - 2, pStyle); +00743 NO_DBG_DEC(pStyle->sLeftIndent); +00744 NO_DBG_DEC(pStyle->sRightIndent); +00745 NO_DBG_HEX(pStyle->ucAlignment); +00746 } +00747 tPos += 2 + tUpxLen; +00748 if (odd(tPos)) { +00749 tPos++; +00750 } +00751 NO_DBG_DEC(tPos); +00752 tUpxLen = (size_t)usGetWord( +00753 tOffset + tPos, aucBuffer); +00754 NO_DBG_DEC(tUpxLen); +00755 } +00756 if (tUpxLen == 0 || tPos + tUpxLen > tStdLen) { +00757 /* Too small or too large to be a record */ +00758 DBG_DEC_C(tPos + tUpxLen > tStdLen, +00759 tPos + tUpxLen); +00760 continue; +00761 } +00762 if ((usStyleType == SGC_PAP && usUpxCount >= 2) || +00763 (usStyleType == SGC_CHP && usUpxCount >= 1)) { +00764 NO_DBG_PRINT_BLOCK( +00765 aucBuffer + tOffset + tPos + 2, +00766 tUpxLen); +00767 vGet8FontInfo(0, ISTD_INVALID, +00768 aucBuffer + tOffset + tPos + 2, +00769 (int)tUpxLen, pFont); +00770 NO_DBG_DEC(pFont->usFontSize); +00771 NO_DBG_DEC(pFont->ucFontcolor); +00772 NO_DBG_HEX(pFont->usFontStyle); +00773 } +00774 } +00775 NO_DBG_DEC(iCounter); +00776 } while (iCounter > 0); +00777 +00778 /* Fill records that are still empty */ +00779 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00780 if (!abFilled[iIndex]) { +00781 NO_DBG_DEC(iIndex); +00782 vGetDefaultStyle(&atStyleInfo[iIndex]); +00783 vGetDefaultFont(&atFontInfo[iIndex], +00784 usFtcStandardChpStsh); +00785 } +00786 } +00787 +00788 /* Clean up before you leave */ +00789 abFilled = xfree(abFilled); +00790 aucBuffer = xfree(aucBuffer); +00791 } /* end of vGet8Stylesheet */ +00792 +00793 /* +00794 * vFillStyleFromStylesheet - fill a style struct with stylesheet info +00795 */ +00796 void +00797 vFillStyleFromStylesheet(USHORT usIstd, style_block_type *pStyle) +00798 { +00799 int iIndex; +00800 +00801 fail(pStyle == NULL); +00802 +00803 if (usIstd != ISTD_INVALID && usIstd != STI_NIL && usIstd != STI_USER) { +00804 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00805 if (atStyleInfo[iIndex].usIstd == usIstd) { +00806 /* Right index found; return style */ +00807 *pStyle = atStyleInfo[iIndex]; +00808 return; +00809 } +00810 } +00811 } +00812 +00813 vGetDefaultStyle(pStyle); +00814 pStyle->usIstd = usIstd; +00815 } /* end of vFillStyleFromStylesheet */ +00816 +00817 /* +00818 * vFillFontFromStylesheet - fill a font struct with stylesheet info +00819 */ +00820 void +00821 vFillFontFromStylesheet(USHORT usIstd, font_block_type *pFont) +00822 { +00823 int iIndex; +00824 +00825 fail(pFont == NULL); +00826 +00827 if (usIstd != ISTD_INVALID && usIstd != STI_NIL && usIstd != STI_USER) { +00828 for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) { +00829 if (atStyleInfo[iIndex].usIstd == usIstd) { +00830 /* Right index found; return font */ +00831 *pFont = atFontInfo[iIndex]; +00832 return; +00833 } +00834 } +00835 } +00836 +00837 vGetDefaultFont(pFont, 0); +00838 } /* end of vFillFontFromStylesheet */ +