diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/stylesheet_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/stylesheet_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,854 +0,0 @@ - - - - -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
- -