diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/prop0_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/prop0_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,505 +0,0 @@ - - - - -TB9.2 Example Applications: examples/PIPS/antiword/src/prop0.c Source File - - - - - -

examples/PIPS/antiword/src/prop0.c

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