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 @@ + + + + +TB9.2 Example Applications: examples/PIPS/antiword/src/stylesheet.c Source File + + + + + +

examples/PIPS/antiword/src/stylesheet.c

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 */
+
+
Generated by  + +doxygen 1.6.2
+ +