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

examples/PIPS/antiword/src/notes.c

00001 /*
-00002  * notes.c
-00003  * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL
-00004  *
-00005  * Description:
-00006  * Functions to tell the difference between footnotes and endnotes
-00007  */
-00008 
-00009 #include "antiword.h"
-00010 
-00011 /*
-00012  * Private structures to hide the way the information
-00013  * is stored from the rest of the program
-00014  */
-00015 typedef struct footnote_local_tag {
-00016         footnote_block_type     tInfo;
-00017         ULONG                   ulCharPosStart;
-00018         ULONG                   ulCharPosNext;
-00019         BOOL                    bUseful;
-00020 } footnote_local_type;
-00021 
-00022 /* Variables needed to write the Footnote and Endnote information */
-00023 static ULONG    *aulFootnoteList = NULL;
-00024 static size_t   tFootnoteListLength = 0;
-00025 static ULONG    *aulEndnoteList = NULL;
-00026 static size_t   tEndnoteListLength = 0;
-00027 /* Variables needed to write the Footnote Text */
-00028 static footnote_local_type      *pFootnoteText = NULL;
-00029 static size_t                   tFootnoteTextLength = 0;
-00030 
-00031 
-00032 /*
-00033  * Destroy the lists with footnote and endnote information
-00034  */
-00035 void
-00036 vDestroyNotesInfoLists(void)
-00037 {
-00038         footnote_local_type     *pRecord;
-00039         size_t                  tFootnote;
-00040 
-00041         TRACE_MSG("vDestroyNotesInfoLists");
-00042 
-00043         /* Free the lists and reset all control variables */
-00044         aulEndnoteList = xfree(aulEndnoteList);
-00045         aulFootnoteList = xfree(aulFootnoteList);
-00046         tEndnoteListLength = 0;
-00047         tFootnoteListLength = 0;
-00048         for (tFootnote = 0; tFootnote < tFootnoteTextLength; tFootnote++) {
-00049                 pRecord = pFootnoteText + tFootnote;
-00050                 pRecord->tInfo.szText = xfree(pRecord->tInfo.szText);
-00051         }
-00052         pFootnoteText = xfree(pFootnoteText);
-00053         tFootnoteTextLength = 0;
-00054 } /* end of vDestroyNotesInfoLists */
-00055 
-00056 /*
-00057  * Build the list with footnote information for Word for DOS files
-00058  */
-00059 static void
-00060 vGet0FootnotesInfoAndText(FILE *pFile, const UCHAR *aucHeader)
-00061 {
-00062         footnote_local_type     *pCurr;
-00063         UCHAR   *aucBuffer;
-00064         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;
-00065         ULONG   ulCharPos, ulBeginNextBlock;
-00066         size_t  tFootnotes, tFootnoteInfoLen;
-00067         size_t  tIndex;
-00068         UCHAR   aucTmp[2];
-00069 
-00070         TRACE_MSG("vGet0FootnotesInfoAndText");
-00071 
-00072         fail(pFile == NULL || aucHeader == NULL);
-00073 
-00074         ulBeginOfText = 128;
-00075         NO_DBG_HEX(ulBeginOfText);
-00076         ulBeginFootnoteInfo =  128 * (ULONG)usGetWord(0x14, aucHeader);
-00077         DBG_HEX(ulBeginFootnoteInfo);
-00078         ulBeginNextBlock = 128 * (ULONG)usGetWord(0x16, aucHeader);
-00079         DBG_HEX(ulBeginNextBlock);
-00080 
-00081         if (ulBeginFootnoteInfo == ulBeginNextBlock) {
-00082                 DBG_MSG("No Footnotes in this document");
-00083                 return;
-00084         }
-00085 
-00086         /* Read the the number of footnotes + 1 */
-00087         if (!bReadBytes(aucTmp, 2, ulBeginFootnoteInfo, pFile)) {
-00088                 return;
-00089         }
-00090         tFootnotes = (size_t)usGetWord(0, aucTmp);
-00091         if (tFootnotes < 2) {
-00092                 DBG_MSG("No Footnotes in this document (2)");
-00093         }
-00094         DBG_DEC(tFootnotes);
-00095         tFootnoteInfoLen =  8 * tFootnotes;
-00096 
-00097         aucBuffer = xmalloc(tFootnoteInfoLen);
-00098         if (!bReadBytes(aucBuffer,
-00099                         tFootnoteInfoLen, ulBeginFootnoteInfo + 4, pFile)) {
-00100                 aucBuffer = xfree(aucBuffer);
-00101                 return;
-00102         }
-00103         DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);
-00104 
-00105         /* Get footnote information */
-00106         fail(tFootnoteListLength != 0);
-00107         tFootnoteListLength = tFootnotes - 1;
-00108         fail(tFootnoteListLength == 0);
-00109 
-00110         fail(aulFootnoteList != NULL);
-00111         aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));
-00112 
-00113         for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {
-00114                 ulOffset = ulGetLong(tIndex * 8, aucBuffer);
-00115                 DBG_HEX(ulOffset);
-00116                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00117                 DBG_HEX(ulFileOffset);
-00118                 aulFootnoteList[tIndex] = ulFileOffset;
-00119         }
-00120 
-00121         /* Get footnote text */
-00122         fail(tFootnoteTextLength != 0);
-00123         tFootnoteTextLength = tFootnotes - 1;
-00124         fail(tFootnoteTextLength == 0);
-00125 
-00126         fail(pFootnoteText != NULL);
-00127         pFootnoteText = xcalloc(tFootnoteTextLength,
-00128                                 sizeof(footnote_local_type));
-00129 
-00130         for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {
-00131                 pCurr = pFootnoteText + tIndex;
-00132                 pCurr->tInfo.szText = NULL;
-00133                 ulOffset = ulGetLong(tIndex * 8 + 4, aucBuffer);
-00134                 DBG_HEX(ulOffset);
-00135                 ulCharPos = ulBeginOfText + ulOffset;
-00136                 DBG_HEX(ulCharPos);
-00137                 DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00138                 pCurr->ulCharPosStart = ulCharPos;
-00139                 ulOffset = ulGetLong((tIndex + 1) * 8 + 4, aucBuffer);
-00140                 DBG_HEX(ulOffset);
-00141                 ulCharPos = ulBeginOfText + ulOffset;
-00142                 DBG_HEX(ulCharPos);
-00143                 DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00144                 pCurr->ulCharPosNext = ulCharPos;
-00145                 pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;
-00146         }
-00147         aucBuffer = xfree(aucBuffer);
-00148 } /* end of vGet0FootnotesInfoAndText */
-00149 
-00150 /*
-00151  * Build the lists note information for Word for DOS files
-00152  */
-00153 static void
-00154 vGet0NotesInfo(FILE *pFile, const UCHAR *aucHeader)
-00155 {
-00156         TRACE_MSG("vGet0NotesInfo");
-00157 
-00158         vGet0FootnotesInfoAndText(pFile, aucHeader);
-00159         /* There are no endnotes in a Word for DOS file */
-00160 } /* end of vGet0NotesInfo */
-00161 
-00162 /*
-00163  * Build the list with footnote information for WinWord 1/2 files
-00164  */
-00165 static void
-00166 vGet2FootnotesInfo(FILE *pFile, const UCHAR *aucHeader)
-00167 {
-00168         UCHAR   *aucBuffer;
-00169         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;
-00170         size_t  tFootnoteInfoLen;
-00171         size_t  tIndex;
-00172 
-00173         TRACE_MSG("vGet2FootnotesInfo");
-00174 
-00175         fail(pFile == NULL || aucHeader == NULL);
-00176 
-00177         ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */
-00178         NO_DBG_HEX(ulBeginOfText);
-00179         ulBeginFootnoteInfo = ulGetLong(0x64, aucHeader); /* fcPlcffndRef */
-00180         NO_DBG_HEX(ulBeginFootnoteInfo);
-00181         tFootnoteInfoLen = (size_t)usGetWord(0x68, aucHeader); /* cbPlcffndRef */
-00182         NO_DBG_DEC(tFootnoteInfoLen);
-00183 
-00184         if (tFootnoteInfoLen < 10) {
-00185                 DBG_MSG("No Footnotes in this document");
-00186                 return;
-00187         }
-00188 
-00189         aucBuffer = xmalloc(tFootnoteInfoLen);
-00190         if (!bReadBytes(aucBuffer,
-00191                         tFootnoteInfoLen, ulBeginFootnoteInfo, pFile)) {
-00192                 aucBuffer = xfree(aucBuffer);
-00193                 return;
-00194         }
-00195         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);
-00196 
-00197         fail(tFootnoteListLength != 0);
-00198         tFootnoteListLength = (tFootnoteInfoLen - 4) / 6;
-00199         fail(tFootnoteListLength == 0);
-00200 
-00201         fail(aulFootnoteList != NULL);
-00202         aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));
-00203 
-00204         for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {
-00205                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00206                 NO_DBG_HEX(ulOffset);
-00207                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00208                 NO_DBG_HEX(ulFileOffset);
-00209                 aulFootnoteList[tIndex] = ulFileOffset;
-00210         }
-00211         aucBuffer = xfree(aucBuffer);
-00212 } /* end of vGet2FootnotesInfo */
-00213 
-00214 /*
-00215  * Build the list with footnote text information for WinWord 1/2 files
-00216  */
-00217 static void
-00218 vGet2FootnotesText(FILE *pFile, const UCHAR *aucHeader)
-00219 {
-00220         footnote_local_type     *pCurr;
-00221         UCHAR   *aucBuffer;
-00222         ULONG   ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText;
-00223         size_t  tFootnoteTextLen;
-00224         size_t  tIndex;
-00225 
-00226         TRACE_MSG("vGet2FootnotesText");
-00227 
-00228         fail(pFile == NULL || aucHeader == NULL);
-00229 
-00230         ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */
-00231         ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */
-00232         NO_DBG_HEX(ulBeginOfFootnotes);
-00233 
-00234         ulBeginFootnoteText = ulGetLong(0x6a, aucHeader); /* fcPlcffndTxt */
-00235         NO_DBG_HEX(ulBeginFootnoteText);
-00236         tFootnoteTextLen =
-00237                 (size_t)usGetWord(0x6e, aucHeader); /* cbPlcffndTxt */
-00238         NO_DBG_DEC(tFootnoteTextLen);
-00239 
-00240         if (tFootnoteTextLen < 12) {
-00241                 DBG_MSG("No Footnote text in this document");
-00242                 return;
-00243         }
-00244 
-00245         aucBuffer = xmalloc(tFootnoteTextLen);
-00246         if (!bReadBytes(aucBuffer,
-00247                         tFootnoteTextLen, ulBeginFootnoteText, pFile)) {
-00248                 aucBuffer = xfree(aucBuffer);
-00249                 return;
-00250         }
-00251         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen);
-00252 
-00253         fail(tFootnoteTextLength != 0);
-00254         tFootnoteTextLength = tFootnoteTextLen / 4 - 2;
-00255         fail(tFootnoteTextLength == 0);
-00256 
-00257         fail(pFootnoteText != NULL);
-00258         pFootnoteText = xcalloc(tFootnoteTextLength,
-00259                                 sizeof(footnote_local_type));
-00260 
-00261         for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {
-00262                 pCurr = pFootnoteText + tIndex;
-00263                 pCurr->tInfo.szText = NULL;
-00264                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00265                 NO_DBG_HEX(ulOffset);
-00266                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00267                 NO_DBG_HEX(ulCharPos);
-00268                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00269                 pCurr->ulCharPosStart = ulCharPos;
-00270                 ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer);
-00271                 NO_DBG_HEX(ulOffset);
-00272                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00273                 NO_DBG_HEX(ulCharPos);
-00274                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00275                 pCurr->ulCharPosNext = ulCharPos;
-00276                 pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;
-00277         }
-00278         aucBuffer = xfree(aucBuffer);
-00279 } /* end of vGet2FootnotesText */
-00280 
-00281 /*
-00282  * Build the lists note information for WinWord 1/2 files
-00283  */
-00284 static void
-00285 vGet2NotesInfo(FILE *pFile, const UCHAR *aucHeader)
-00286 {
-00287         TRACE_MSG("vGet2NotesInfo");
-00288 
-00289         vGet2FootnotesInfo(pFile, aucHeader);
-00290         vGet2FootnotesText(pFile, aucHeader);
-00291         /* There are no endnotes in a WinWord 1/2 file */
-00292 } /* end of vGet2NotesInfo */
-00293 
-00294 /*
-00295  * Build the list with footnote information for Word 6/7 files
-00296  */
-00297 static void
-00298 vGet6FootnotesInfo(FILE *pFile, ULONG ulStartBlock,
-00299         const ULONG *aulBBD, size_t tBBDLen,
-00300         const UCHAR *aucHeader)
-00301 {
-00302         UCHAR   *aucBuffer;
-00303         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;
-00304         size_t  tFootnoteInfoLen;
-00305         size_t  tIndex;
-00306 
-00307         TRACE_MSG("vGet6FootnotesInfo");
-00308 
-00309         fail(pFile == NULL || aucHeader == NULL);
-00310         fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
-00311         fail(aulBBD == NULL);
-00312 
-00313         ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */
-00314         NO_DBG_HEX(ulBeginOfText);
-00315         ulBeginFootnoteInfo = ulGetLong(0x68, aucHeader); /* fcPlcffndRef */
-00316         NO_DBG_HEX(ulBeginFootnoteInfo);
-00317         tFootnoteInfoLen =
-00318                 (size_t)ulGetLong(0x6c, aucHeader); /* lcbPlcffndRef */
-00319         NO_DBG_DEC(tFootnoteInfoLen);
-00320 
-00321         if (tFootnoteInfoLen < 10) {
-00322                 DBG_MSG("No Footnotes in this document");
-00323                 return;
-00324         }
-00325 
-00326         aucBuffer = xmalloc(tFootnoteInfoLen);
-00327         if (!bReadBuffer(pFile, ulStartBlock,
-00328                         aulBBD, tBBDLen, BIG_BLOCK_SIZE,
-00329                         aucBuffer, ulBeginFootnoteInfo, tFootnoteInfoLen)) {
-00330                 aucBuffer = xfree(aucBuffer);
-00331                 return;
-00332         }
-00333         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);
-00334 
-00335         fail(tFootnoteListLength != 0);
-00336         tFootnoteListLength = (tFootnoteInfoLen - 4) / 6;
-00337         fail(tFootnoteListLength == 0);
-00338 
-00339         fail(aulFootnoteList != NULL);
-00340         aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));
-00341 
-00342         for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {
-00343                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00344                 NO_DBG_HEX(ulOffset);
-00345                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00346                 NO_DBG_HEX(ulFileOffset);
-00347                 aulFootnoteList[tIndex] = ulFileOffset;
-00348         }
-00349         aucBuffer = xfree(aucBuffer);
-00350 } /* end of vGet6FootnotesInfo */
-00351 
-00352 /*
-00353  * Build the list with footnote text information for Word 6/7 files
-00354  */
-00355 static void
-00356 vGet6FootnotesText(FILE *pFile, ULONG ulStartBlock,
-00357         const ULONG *aulBBD, size_t tBBDLen,
-00358         const UCHAR *aucHeader)
-00359 {
-00360         footnote_local_type     *pCurr;
-00361         UCHAR   *aucBuffer;
-00362         ULONG   ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText;
-00363         size_t  tFootnoteTextLen;
-00364         size_t  tIndex;
-00365 
-00366         TRACE_MSG("vGet6FootnotesText");
-00367 
-00368         fail(pFile == NULL || aucHeader == NULL);
-00369         fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
-00370         fail(aulBBD == NULL);
-00371 
-00372         ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */
-00373         ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */
-00374         NO_DBG_HEX(ulBeginOfFootnotes);
-00375 
-00376         ulBeginFootnoteText = ulGetLong(0x70, aucHeader); /* fcPlcffndTxt */
-00377         NO_DBG_HEX(ulBeginFootnoteText);
-00378         tFootnoteTextLen =
-00379                 (size_t)ulGetLong(0x74, aucHeader); /* lcbPlcffndTxt */
-00380         NO_DBG_DEC(tFootnoteTextLen);
-00381 
-00382         if (tFootnoteTextLen < 12) {
-00383                 DBG_MSG("No Footnote text in this document");
-00384                 return;
-00385         }
-00386 
-00387         aucBuffer = xmalloc(tFootnoteTextLen);
-00388         if (!bReadBuffer(pFile, ulStartBlock,
-00389                         aulBBD, tBBDLen, BIG_BLOCK_SIZE,
-00390                         aucBuffer, ulBeginFootnoteText, tFootnoteTextLen)) {
-00391                 aucBuffer = xfree(aucBuffer);
-00392                 return;
-00393         }
-00394         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen);
-00395 
-00396         fail(tFootnoteTextLength != 0);
-00397         tFootnoteTextLength = tFootnoteTextLen / 4 - 2;
-00398         fail(tFootnoteTextLength == 0);
-00399 
-00400         fail(pFootnoteText != NULL);
-00401         pFootnoteText = xcalloc(tFootnoteTextLength,
-00402                                 sizeof(footnote_local_type));
-00403 
-00404         for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {
-00405                 pCurr = pFootnoteText + tIndex;
-00406                 pCurr->tInfo.szText = NULL;
-00407                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00408                 NO_DBG_HEX(ulOffset);
-00409                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00410                 NO_DBG_HEX(ulCharPos);
-00411                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00412                 pCurr->ulCharPosStart = ulCharPos;
-00413                 ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer);
-00414                 NO_DBG_HEX(ulOffset);
-00415                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00416                 NO_DBG_HEX(ulCharPos);
-00417                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00418                 pCurr->ulCharPosNext = ulCharPos;
-00419                 pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;
-00420         }
-00421         aucBuffer = xfree(aucBuffer);
-00422 } /* end of vGet6FootnotesText */
-00423 
-00424 /*
-00425  * Build the list with endnote information for Word 6/7 files
-00426  */
-00427 static void
-00428 vGet6EndnotesInfo(FILE *pFile, ULONG ulStartBlock,
-00429         const ULONG *aulBBD, size_t tBBDLen,
-00430         const UCHAR *aucHeader)
-00431 {
-00432         UCHAR   *aucBuffer;
-00433         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginEndnoteInfo;
-00434         size_t  tEndnoteInfoLen;
-00435         size_t  tIndex;
-00436 
-00437         TRACE_MSG("vGet6EndnotesInfo");
-00438 
-00439         fail(pFile == NULL || aucHeader == NULL);
-00440         fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
-00441         fail(aulBBD == NULL);
-00442 
-00443         ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */
-00444         NO_DBG_HEX(ulBeginOfText);
-00445         ulBeginEndnoteInfo = ulGetLong(0x1d2, aucHeader); /* fcPlcfendRef */
-00446         NO_DBG_HEX(ulBeginEndnoteInfo);
-00447         tEndnoteInfoLen =
-00448                 (size_t)ulGetLong(0x1d6, aucHeader); /* lcbPlcfendRef */
-00449         NO_DBG_DEC(tEndnoteInfoLen);
-00450 
-00451         if (tEndnoteInfoLen < 10) {
-00452                 DBG_MSG("No Endnotes in this document");
-00453                 return;
-00454         }
-00455 
-00456         aucBuffer = xmalloc(tEndnoteInfoLen);
-00457         if (!bReadBuffer(pFile, ulStartBlock,
-00458                         aulBBD, tBBDLen, BIG_BLOCK_SIZE,
-00459                         aucBuffer, ulBeginEndnoteInfo, tEndnoteInfoLen)) {
-00460                 aucBuffer = xfree(aucBuffer);
-00461                 return;
-00462         }
-00463         NO_DBG_PRINT_BLOCK(aucBuffer, tEndnoteInfoLen);
-00464 
-00465         fail(tEndnoteListLength != 0);
-00466         tEndnoteListLength = (tEndnoteInfoLen - 4) / 6;
-00467         fail(tEndnoteListLength == 0);
-00468 
-00469         fail(aulEndnoteList != NULL);
-00470         aulEndnoteList = xcalloc(tEndnoteListLength, sizeof(ULONG));
-00471 
-00472         for (tIndex = 0; tIndex < tEndnoteListLength; tIndex++) {
-00473                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00474                 NO_DBG_HEX(ulOffset);
-00475                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00476                 NO_DBG_HEX(ulFileOffset);
-00477                 aulEndnoteList[tIndex] = ulFileOffset;
-00478         }
-00479         aucBuffer = xfree(aucBuffer);
-00480 } /* end of vGet6EndnotesInfo */
-00481 
-00482 /*
-00483  * Build the lists note information for Word 6/7 files
-00484  */
-00485 static void
-00486 vGet6NotesInfo(FILE *pFile, ULONG ulStartBlock,
-00487         const ULONG *aulBBD, size_t tBBDLen,
-00488         const UCHAR *aucHeader)
-00489 {
-00490         TRACE_MSG("vGet6NotesInfo");
-00491 
-00492         vGet6FootnotesInfo(pFile, ulStartBlock,
-00493                         aulBBD, tBBDLen, aucHeader);
-00494         vGet6FootnotesText(pFile, ulStartBlock,
-00495                         aulBBD, tBBDLen, aucHeader);
-00496         vGet6EndnotesInfo(pFile, ulStartBlock,
-00497                         aulBBD, tBBDLen, aucHeader);
-00498 } /* end of vGet6NotesInfo */
-00499 
-00500 /*
-00501  * Build the list with footnote information for Word 8/9/10 files
-00502  */
-00503 static void
-00504 vGet8FootnotesInfo(FILE *pFile, const pps_info_type *pPPS,
-00505         const ULONG *aulBBD, size_t tBBDLen,
-00506         const ULONG *aulSBD, size_t tSBDLen,
-00507         const UCHAR *aucHeader)
-00508 {
-00509         const ULONG     *aulBlockDepot;
-00510         UCHAR   *aucBuffer;
-00511         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;
-00512         size_t  tFootnoteInfoLen, tBlockDepotLen, tBlockSize;
-00513         size_t  tIndex;
-00514 
-00515         TRACE_MSG("vGet8FootnotesInfo");
-00516 
-00517         ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */
-00518         NO_DBG_HEX(ulBeginOfText);
-00519         ulBeginFootnoteInfo = ulGetLong(0xaa, aucHeader); /* fcPlcffndRef */
-00520         NO_DBG_HEX(ulBeginFootnoteInfo);
-00521         tFootnoteInfoLen =
-00522                 (size_t)ulGetLong(0xae, aucHeader); /* lcbPlcffndRef */
-00523         NO_DBG_DEC(tFootnoteInfoLen);
-00524 
-00525         if (tFootnoteInfoLen < 10) {
-00526                 DBG_MSG("No Footnotes in this document");
-00527                 return;
-00528         }
-00529 
-00530         NO_DBG_DEC(pPPS->tTable.ulSB);
-00531         NO_DBG_HEX(pPPS->tTable.ulSize);
-00532         if (pPPS->tTable.ulSize == 0) {
-00533                 DBG_MSG("No footnotes information");
-00534                 return;
-00535         }
-00536 
-00537         if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
-00538                 /* Use the Small Block Depot */
-00539                 aulBlockDepot = aulSBD;
-00540                 tBlockDepotLen = tSBDLen;
-00541                 tBlockSize = SMALL_BLOCK_SIZE;
-00542         } else {
-00543                 /* Use the Big Block Depot */
-00544                 aulBlockDepot = aulBBD;
-00545                 tBlockDepotLen = tBBDLen;
-00546                 tBlockSize = BIG_BLOCK_SIZE;
-00547         }
-00548         aucBuffer = xmalloc(tFootnoteInfoLen);
-00549         if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
-00550                         aulBlockDepot, tBlockDepotLen, tBlockSize,
-00551                         aucBuffer, ulBeginFootnoteInfo, tFootnoteInfoLen)) {
-00552                 aucBuffer = xfree(aucBuffer);
-00553                 return;
-00554         }
-00555         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);
-00556 
-00557         fail(tFootnoteListLength != 0);
-00558         tFootnoteListLength = (tFootnoteInfoLen - 4) / 6;
-00559         fail(tFootnoteListLength == 0);
-00560 
-00561         fail(aulFootnoteList != NULL);
-00562         aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));
-00563 
-00564         for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {
-00565                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00566                 NO_DBG_HEX(ulOffset);
-00567                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00568                 NO_DBG_HEX(ulFileOffset);
-00569                 aulFootnoteList[tIndex] = ulFileOffset;
-00570         }
-00571         aucBuffer = xfree(aucBuffer);
-00572 } /* end of vGet8FootnotesInfo */
-00573 
-00574 /*
-00575  * Build the list with footnote text information for Word 8/9/10 files
-00576  */
-00577 static void
-00578 vGet8FootnotesText(FILE *pFile, const pps_info_type *pPPS,
-00579         const ULONG *aulBBD, size_t tBBDLen,
-00580         const ULONG *aulSBD, size_t tSBDLen,
-00581         const UCHAR *aucHeader)
-00582 {
-00583         footnote_local_type     *pCurr;
-00584         const ULONG     *aulBlockDepot;
-00585         UCHAR   *aucBuffer;
-00586         ULONG   ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText;
-00587         size_t  tFootnoteTextLen, tBlockDepotLen, tBlockSize;
-00588         size_t  tIndex;
-00589 
-00590         TRACE_MSG("vGet8FootnotesText");
-00591 
-00592         ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */
-00593         ulBeginOfFootnotes += ulGetLong(0x4c, aucHeader); /* ccpText */
-00594         NO_DBG_HEX(ulBeginOfFootnotes);
-00595 
-00596         ulBeginFootnoteText = ulGetLong(0xb2, aucHeader); /* fcPlcffndTxt */
-00597         NO_DBG_HEX(ulBeginFootnoteText);
-00598         tFootnoteTextLen =
-00599                 (size_t)ulGetLong(0xb6, aucHeader); /* lcbPlcffndTxt */
-00600         NO_DBG_DEC(tFootnoteTextLen);
-00601 
-00602         if (tFootnoteTextLen < 12) {
-00603                 DBG_MSG("No Footnote text in this document");
-00604                 return;
-00605         }
-00606 
-00607         NO_DBG_DEC(pPPS->tTable.ulSB);
-00608         NO_DBG_HEX(pPPS->tTable.ulSize);
-00609         if (pPPS->tTable.ulSize == 0) {
-00610                 DBG_MSG("No footnote text information");
-00611                 return;
-00612         }
-00613 
-00614         if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
-00615                 /* Use the Small Block Depot */
-00616                 aulBlockDepot = aulSBD;
-00617                 tBlockDepotLen = tSBDLen;
-00618                 tBlockSize = SMALL_BLOCK_SIZE;
-00619         } else {
-00620                 /* Use the Big Block Depot */
-00621                 aulBlockDepot = aulBBD;
-00622                 tBlockDepotLen = tBBDLen;
-00623                 tBlockSize = BIG_BLOCK_SIZE;
-00624         }
-00625         aucBuffer = xmalloc(tFootnoteTextLen);
-00626         if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
-00627                         aulBlockDepot, tBlockDepotLen, tBlockSize,
-00628                         aucBuffer, ulBeginFootnoteText, tFootnoteTextLen)) {
-00629                 aucBuffer = xfree(aucBuffer);
-00630                 return;
-00631         }
-00632         NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen);
-00633 
-00634         fail(tFootnoteTextLength != 0);
-00635         tFootnoteTextLength = tFootnoteTextLen / 4 - 2;
-00636         fail(tFootnoteTextLength == 0);
-00637 
-00638         fail(pFootnoteText != NULL);
-00639         pFootnoteText = xcalloc(tFootnoteTextLength,
-00640                                 sizeof(footnote_local_type));
-00641 
-00642         for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {
-00643                 pCurr = pFootnoteText + tIndex;
-00644                 pCurr->tInfo.szText = NULL;
-00645                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00646                 NO_DBG_HEX(ulOffset);
-00647                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00648                 NO_DBG_HEX(ulCharPos);
-00649                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00650                 pCurr->ulCharPosStart = ulCharPos;
-00651                 ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer);
-00652                 NO_DBG_HEX(ulOffset);
-00653                 ulCharPos = ulBeginOfFootnotes + ulOffset;
-00654                 NO_DBG_HEX(ulCharPos);
-00655                 NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));
-00656                 pCurr->ulCharPosNext = ulCharPos;
-00657                 pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;
-00658         }
-00659         aucBuffer = xfree(aucBuffer);
-00660 } /* end of vGet8FootnotesText */
-00661 
-00662 /*
-00663  * Build the list with endnote information for Word 8/9/10 files
-00664  */
-00665 static void
-00666 vGet8EndnotesInfo(FILE *pFile, const pps_info_type *pPPS,
-00667         const ULONG *aulBBD, size_t tBBDLen,
-00668         const ULONG *aulSBD, size_t tSBDLen,
-00669         const UCHAR *aucHeader)
-00670 {
-00671         const ULONG     *aulBlockDepot;
-00672         UCHAR   *aucBuffer;
-00673         ULONG   ulFileOffset, ulBeginOfText, ulOffset, ulBeginEndnoteInfo;
-00674         size_t  tEndnoteInfoLen, tBlockDepotLen, tBlockSize;
-00675         size_t  tIndex;
-00676 
-00677         TRACE_MSG("vGet8EndnotesInfo");
-00678 
-00679         ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */
-00680         NO_DBG_HEX(ulBeginOfText);
-00681         ulBeginEndnoteInfo = ulGetLong(0x20a, aucHeader); /* fcPlcfendRef */
-00682         NO_DBG_HEX(ulBeginEndnoteInfo);
-00683         tEndnoteInfoLen = (size_t)ulGetLong(0x20e, aucHeader); /* lcbPlcfendRef */
-00684         NO_DBG_DEC(tEndnoteInfoLen);
-00685 
-00686         if (tEndnoteInfoLen < 10) {
-00687                 DBG_MSG("No endnotes in this document");
-00688                 return;
-00689         }
-00690 
-00691         NO_DBG_DEC(pPPS->tTable.ulSB);
-00692         NO_DBG_HEX(pPPS->tTable.ulSize);
-00693         if (pPPS->tTable.ulSize == 0) {
-00694                 DBG_MSG("No endnotes information");
-00695                 return;
-00696         }
-00697 
-00698         if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
-00699                 /* Use the Small Block Depot */
-00700                 aulBlockDepot = aulSBD;
-00701                 tBlockDepotLen = tSBDLen;
-00702                 tBlockSize = SMALL_BLOCK_SIZE;
-00703         } else {
-00704                 /* Use the Big Block Depot */
-00705                 aulBlockDepot = aulBBD;
-00706                 tBlockDepotLen = tBBDLen;
-00707                 tBlockSize = BIG_BLOCK_SIZE;
-00708         }
-00709         aucBuffer = xmalloc(tEndnoteInfoLen);
-00710         if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
-00711                         aulBlockDepot, tBlockDepotLen, tBlockSize,
-00712                         aucBuffer, ulBeginEndnoteInfo, tEndnoteInfoLen)) {
-00713                 aucBuffer = xfree(aucBuffer);
-00714                 return;
-00715         }
-00716         NO_DBG_PRINT_BLOCK(aucBuffer, tEndnoteInfoLen);
-00717 
-00718         fail(tEndnoteListLength != 0);
-00719         tEndnoteListLength = (tEndnoteInfoLen - 4) / 6;
-00720         fail(tEndnoteListLength == 0);
-00721 
-00722         fail(aulEndnoteList != NULL);
-00723         aulEndnoteList = xcalloc(tEndnoteListLength, sizeof(ULONG));
-00724 
-00725         for (tIndex = 0; tIndex < tEndnoteListLength; tIndex++) {
-00726                 ulOffset = ulGetLong(tIndex * 4, aucBuffer);
-00727                 NO_DBG_HEX(ulOffset);
-00728                 ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);
-00729                 NO_DBG_HEX(ulFileOffset);
-00730                 aulEndnoteList[tIndex] = ulFileOffset;
-00731         }
-00732         aucBuffer = xfree(aucBuffer);
-00733 } /* end of vGet8EndnotesInfo */
-00734 
-00735 /*
-00736  * Build the lists with footnote and endnote information for Word 8/9/10 files
-00737  */
-00738 static void
-00739 vGet8NotesInfo(FILE *pFile, const pps_info_type *pPPS,
-00740         const ULONG *aulBBD, size_t tBBDLen,
-00741         const ULONG *aulSBD, size_t tSBDLen,
-00742         const UCHAR *aucHeader)
-00743 {
-00744         TRACE_MSG("vGet8NotesInfo");
-00745 
-00746         vGet8FootnotesInfo(pFile, pPPS,
-00747                         aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
-00748         vGet8FootnotesText(pFile, pPPS,
-00749                         aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
-00750         vGet8EndnotesInfo(pFile, pPPS,
-00751                         aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
-00752 } /* end of vGet8NotesInfo */
-00753 
-00754 /*
-00755  * Build the lists with footnote and endnote information
-00756  */
-00757 void
-00758 vGetNotesInfo(FILE *pFile, const pps_info_type *pPPS,
-00759         const ULONG *aulBBD, size_t tBBDLen,
-00760         const ULONG *aulSBD, size_t tSBDLen,
-00761         const UCHAR *aucHeader, int iWordVersion)
-00762 {
-00763         TRACE_MSG("vGetNotesInfo");
-00764 
-00765         fail(pFile == NULL);
-00766         fail(pPPS == NULL && iWordVersion >= 6);
-00767         fail(aulBBD == NULL && tBBDLen != 0);
-00768         fail(aulSBD == NULL && tSBDLen != 0);
-00769         fail(aucHeader == NULL);
-00770 
-00771         switch (iWordVersion) {
-00772         case 0:
-00773                 vGet0NotesInfo(pFile, aucHeader);
-00774                 break;
-00775         case 1:
-00776         case 2:
-00777                 vGet2NotesInfo(pFile, aucHeader);
-00778                 break;
-00779         case 4:
-00780         case 5:
-00781                 break;
-00782         case 6:
-00783         case 7:
-00784                 vGet6NotesInfo(pFile, pPPS->tWordDocument.ulSB,
-00785                         aulBBD, tBBDLen, aucHeader);
-00786                 break;
-00787         case 8:
-00788                 vGet8NotesInfo(pFile, pPPS,
-00789                         aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
-00790                 break;
-00791         default:
-00792                 werr(0, "Sorry, no notes information");
-00793                 break;
-00794         }
-00795 } /* end of vGetNotesInfo */
-00796 
-00797 /*
-00798  *  vPrepareFootnoteText - prepare the footnote text
-00799  */
-00800 void
-00801 vPrepareFootnoteText(FILE *pFile)
-00802 { 
-00803         footnote_local_type     *pCurr;
-00804         size_t          tFootnote;
-00805 
-00806         fail(pFile == NULL);
-00807         fail(pFootnoteText == NULL && tFootnoteTextLength != 0);
-00808 
-00809         if (pFootnoteText == NULL || tFootnoteTextLength == 0) {
-00810                 /* No information */
-00811                 return;
-00812         }
-00813 
-00814         /* Fill text and useful-ness */
-00815         for (tFootnote = 0; tFootnote < tFootnoteTextLength; tFootnote++) {
-00816                 pCurr = pFootnoteText + tFootnote;
-00817                 pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;
-00818                 if (pCurr->bUseful) {
-00819                         pCurr->tInfo.szText = szFootnoteDecryptor(pFile,
-00820                                                         pCurr->ulCharPosStart,
-00821                                                         pCurr->ulCharPosNext);
-00822                 } else {
-00823                         pCurr->tInfo.szText = NULL;
-00824                 }
-00825         }
-00826 } /* end of vPrepareFootnoteText */
-00827 
-00828 /*
-00829  * szGetFootnootText - get the text of the spefified footnote
-00830  */
-00831 const char *
-00832 szGetFootnootText(UINT uiFootnoteIndex)
-00833 {
-00834         if ((size_t)uiFootnoteIndex >= tFootnoteTextLength) {
-00835                 return NULL;
-00836         }
-00837         return pFootnoteText[uiFootnoteIndex].tInfo.szText;
-00838 } /* end of szGetFootnootText */
-00839 
-00840 /*
-00841  * Get the notetype of the note at the given fileoffset
-00842  */
-00843 notetype_enum
-00844 eGetNotetype(ULONG ulFileOffset)
-00845 {
-00846         size_t  tIndex;
-00847 
-00848         TRACE_MSG("eGetNotetype");
-00849 
-00850         fail(aulFootnoteList == NULL && tFootnoteListLength != 0);
-00851         fail(aulEndnoteList == NULL && tEndnoteListLength != 0);
-00852 
-00853         /* Go for the easy answers first */
-00854         if (tFootnoteListLength == 0 && tEndnoteListLength == 0) {
-00855                 return notetype_is_unknown;
-00856         }
-00857         if (tEndnoteListLength == 0) {
-00858                 return notetype_is_footnote;
-00859         }
-00860         if (tFootnoteListLength == 0) {
-00861                 return notetype_is_endnote;
-00862         }
-00863         /* No easy answer, so we search */
-00864         for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {
-00865                 if (aulFootnoteList[tIndex] == ulFileOffset) {
-00866                         return notetype_is_footnote;
-00867                 }
-00868         }
-00869         for (tIndex = 0; tIndex < tEndnoteListLength; tIndex++) {
-00870                 if (aulEndnoteList[tIndex] == ulFileOffset) {
-00871                         return notetype_is_endnote;
-00872                 }
-00873         }
-00874         /* Not found */
-00875         return notetype_is_unknown;
-00876 } /* end of eGetNotetype */
-
-
Generated by  - -doxygen 1.6.2
- -