diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/listlist_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/listlist_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,346 +0,0 @@ - - -
- -00001 /* -00002 * listlist.c -00003 * Copyright (C) 2002,2003 A.J. van Os; Released under GPL -00004 * -00005 * Description: -00006 * Build, read and destroy a list of Word list information -00007 * -00008 * Note: -00009 * This list only exists when the Word document is saved by Word 8 or later -00010 */ -00011 -00012 #include "antiword.h" -00013 -00014 /* -00015 * Private structure to hide the way the information -00016 * is stored from the rest of the program -00017 */ -00018 typedef struct list_desc_tag { -00019 list_block_type tInfo; -00020 ULONG ulListID; -00021 USHORT usIstd; -00022 UCHAR ucListLevel; -00023 struct list_desc_tag *pNext; -00024 } list_desc_type; -00025 -00026 typedef struct list_value_tag { -00027 USHORT usValue; -00028 USHORT usListIndex; -00029 UCHAR ucListLevel; -00030 struct list_value_tag *pNext; -00031 } list_value_type; -00032 -00033 /* Variables needed to describe the LFO list (pllfo) */ -00034 static ULONG *aulLfoList = NULL; -00035 static USHORT usLfoLen = 0; -00036 /* Variables needed to write the List Information List */ -00037 static list_desc_type *pAnchor = NULL; -00038 static list_desc_type *pBlockLast = NULL; -00039 /* Variable needed for numbering new lists */ -00040 static list_value_type *pValues = NULL; -00041 /* Variables needed for numbering old lists */ -00042 static int iOldListSeqNumber = 0; -00043 static USHORT usOldListValue = 0; -00044 -00045 -00046 /* -00047 * vDestroyListInfoList - destroy the List Information List -00048 */ -00049 void -00050 vDestroyListInfoList(void) -00051 { -00052 list_desc_type *pCurr, *pNext; -00053 list_value_type *pValueCurr, *pValueNext; -00054 -00055 DBG_MSG("vDestroyListInfoList"); -00056 -00057 /* Free the LFO list */ -00058 usLfoLen = 0; -00059 aulLfoList = xfree(aulLfoList); -00060 -00061 /* Free the List Information List */ -00062 pCurr = pAnchor; -00063 while (pCurr != NULL) { -00064 pNext = pCurr->pNext; -00065 pCurr = xfree(pCurr); -00066 pCurr = pNext; -00067 } -00068 pAnchor = NULL; -00069 /* Reset all control variables */ -00070 pBlockLast = NULL; -00071 -00072 /* Free the values list */ -00073 pValueCurr = pValues; -00074 while (pValueCurr != NULL) { -00075 pValueNext = pValueCurr->pNext; -00076 pValueCurr = xfree(pValueCurr); -00077 pValueCurr = pValueNext; -00078 } -00079 pValues = NULL; -00080 /* Reset the values for the old lists */ -00081 iOldListSeqNumber = 0; -00082 usOldListValue = 0; -00083 } /* end of vDestroyListInfoList */ -00084 -00085 /* -00086 * vBuildLfoList - build the LFO list (pllfo) -00087 */ -00088 void -00089 vBuildLfoList(const UCHAR *aucBuffer, size_t tBufLen) -00090 { -00091 size_t tRecords; -00092 int iIndex; -00093 -00094 fail(aucBuffer == NULL); -00095 -00096 if (tBufLen < 4) { -00097 return; -00098 } -00099 tRecords = (size_t)ulGetLong(0, aucBuffer); -00100 NO_DBG_DEC(tRecords); -00101 if (4 + 16 * tRecords > tBufLen || tRecords >= 0x7fff) { -00102 /* Just a sanity check */ -00103 DBG_DEC(tRecords); -00104 DBG_DEC(4 + 16 * tRecords); -00105 DBG_DEC(tBufLen); -00106 return; -00107 } -00108 aulLfoList = xcalloc(tRecords, sizeof(ULONG)); -00109 for (iIndex = 0; iIndex < (int)tRecords; iIndex++) { -00110 aulLfoList[iIndex] = ulGetLong(4 + 16 * iIndex, aucBuffer); -00111 NO_DBG_HEX(aulLfoList[iIndex]); -00112 } -00113 usLfoLen = (USHORT)tRecords; -00114 } /* end of vBuildLfoList */ -00115 -00116 /* -00117 * vAdd2ListInfoList - add an element to the List Information list -00118 */ -00119 void -00120 vAdd2ListInfoList(ULONG ulListID, USHORT usIstd, UCHAR ucListLevel, -00121 const list_block_type *pListBlock) -00122 { -00123 list_desc_type *pListMember; -00124 -00125 fail(pListBlock == NULL); -00126 -00127 NO_DBG_HEX(ulListID); -00128 NO_DBG_DEC(usIstd); -00129 NO_DBG_DEC(ucListLevel); -00130 NO_DBG_DEC(pListBlock->ulStartAt); -00131 NO_DBG_DEC(pListBlock->bNoRestart); -00132 NO_DBG_DEC(pListBlock->sLeftIndent); -00133 NO_DBG_HEX(pListBlock->ucNFC); -00134 NO_DBG_HEX(pListBlock->usListChar); -00135 -00136 /* Create list member */ -00137 pListMember = xmalloc(sizeof(list_desc_type)); -00138 /* Fill the list member */ -00139 pListMember->tInfo = *pListBlock; -00140 pListMember->ulListID = ulListID; -00141 pListMember->usIstd = usIstd; -00142 pListMember->ucListLevel = ucListLevel; -00143 pListMember->pNext = NULL; -00144 /* Correct the values where needed */ -00145 if (pListMember->tInfo.ulStartAt > 0xffff) { -00146 DBG_DEC(pListMember->tInfo.ulStartAt); -00147 pListMember->tInfo.ulStartAt = 1; -00148 } -00149 /* Add the new member to the list */ -00150 if (pAnchor == NULL) { -00151 pAnchor = pListMember; -00152 } else { -00153 fail(pBlockLast == NULL); -00154 pBlockLast->pNext = pListMember; -00155 } -00156 pBlockLast = pListMember; -00157 } /* end of vAdd2ListInfoList */ -00158 -00159 /* -00160 * Get a matching record from the List Information List -00161 * -00162 * Returns NULL if no matching records is found -00163 */ -00164 const list_block_type * -00165 pGetListInfo(USHORT usListIndex, UCHAR ucListLevel) -00166 { -00167 list_desc_type *pCurr; -00168 list_block_type *pNearMatch; -00169 ULONG ulListID; -00170 -00171 if (usListIndex == 0) { -00172 return NULL; -00173 } -00174 if (usListIndex - 1 >= usLfoLen || ucListLevel > 8) { -00175 DBG_DEC(usListIndex); -00176 DBG_DEC(ucListLevel); -00177 return NULL; -00178 } -00179 fail(aulLfoList == NULL); -00180 ulListID = aulLfoList[usListIndex - 1]; -00181 NO_DBG_HEX(ulListID); -00182 -00183 pNearMatch = NULL; -00184 for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { -00185 if (pCurr->ulListID != ulListID) { -00186 /* No match */ -00187 continue; -00188 } -00189 if (pCurr->ucListLevel == ucListLevel) { -00190 /* Exact match */ -00191 return &pCurr->tInfo; -00192 } -00193 if (pCurr->ucListLevel == 0) { -00194 /* Near match */ -00195 pNearMatch = &pCurr->tInfo; -00196 } -00197 } -00198 /* No exact match, use a near match if any */ -00199 return pNearMatch; -00200 } /* end of pGetListInfo */ -00201 -00202 /* -00203 * Get a matching record from the List Information List -00204 * -00205 * Returns NULL if no matching records is found -00206 */ -00207 const list_block_type * -00208 pGetListInfoByIstd(USHORT usIstd) -00209 { -00210 list_desc_type *pCurr; -00211 -00212 if (usIstd == ISTD_INVALID || usIstd == STI_NIL || usIstd == STI_USER) { -00213 return NULL; -00214 } -00215 -00216 for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { -00217 if (pCurr->usIstd == usIstd) { -00218 return &pCurr->tInfo; -00219 } -00220 } -00221 return NULL; -00222 } /* end of pGetListInfoByIstd */ -00223 -00224 /* -00225 * vRestartListValues - reset the less significant list levels -00226 */ -00227 static void -00228 vRestartListValues(USHORT usListIndex, UCHAR ucListLevel) -00229 { -00230 list_value_type *pPrev, *pCurr, *pNext; -00231 int iCounter; -00232 -00233 iCounter = 0; -00234 pPrev = NULL; -00235 pCurr = pValues; -00236 -00237 while (pCurr != NULL) { -00238 if (pCurr->usListIndex != usListIndex || -00239 pCurr->ucListLevel <= ucListLevel) { -00240 pPrev = pCurr; -00241 pCurr = pCurr->pNext; -00242 continue; -00243 } -00244 /* Reset the level by deleting the record */ -00245 pNext = pCurr->pNext; -00246 if (pPrev == NULL) { -00247 pValues = pNext; -00248 } else { -00249 pPrev->pNext = pNext; -00250 } -00251 DBG_DEC(pCurr->usListIndex); -00252 DBG_DEC(pCurr->ucListLevel); -00253 pCurr = xfree(pCurr); -00254 pCurr = pNext; -00255 iCounter++; -00256 } -00257 DBG_DEC_C(iCounter > 0, iCounter); -00258 } /* end of vRestartListValues */ -00259 -00260 /* -00261 * usGetListValue - Get the current value of the given list -00262 * -00263 * Returns the value of the given list -00264 */ -00265 USHORT -00266 usGetListValue(int iListSeqNumber, int iWordVersion, -00267 const style_block_type *pStyle) -00268 { -00269 list_value_type *pCurr; -00270 USHORT usValue; -00271 -00272 fail(iListSeqNumber < 0); -00273 fail(iListSeqNumber < iOldListSeqNumber); -00274 fail(iWordVersion < 0); -00275 fail(pStyle == NULL); -00276 -00277 if (iListSeqNumber <= 0) { -00278 return 0; -00279 } -00280 -00281 if (iWordVersion < 8) { -00282 /* Old style list */ -00283 if (iListSeqNumber == iOldListSeqNumber || -00284 (iListSeqNumber == iOldListSeqNumber + 1 && -00285 eGetNumType(pStyle->ucNumLevel) == level_type_sequence)) { -00286 if (!pStyle->bNumPause) { -00287 usOldListValue++; -00288 } -00289 } else { -00290 usOldListValue = pStyle->usStartAt; -00291 } -00292 iOldListSeqNumber = iListSeqNumber; -00293 return usOldListValue; -00294 } -00295 -00296 /* New style list */ -00297 if (pStyle->usListIndex == 0 || -00298 pStyle->usListIndex - 1 >= usLfoLen || -00299 pStyle->ucListLevel > 8) { -00300 /* Out of range; no need to search */ -00301 return 0; -00302 } -00303 -00304 for (pCurr = pValues; pCurr != NULL; pCurr = pCurr->pNext) { -00305 if (pCurr->usListIndex == pStyle->usListIndex && -00306 pCurr->ucListLevel == pStyle->ucListLevel) { -00307 /* Record found; increment and return the value */ -00308 pCurr->usValue++; -00309 usValue = pCurr->usValue; -00310 if (!pStyle->bNoRestart) { -00311 vRestartListValues(pStyle->usListIndex, -00312 pStyle->ucListLevel); -00313 } -00314 return usValue; -00315 } -00316 } -00317 -00318 /* Record not found; create it and add it to the front of the list */ -00319 pCurr = xmalloc(sizeof(list_value_type)); -00320 pCurr->usValue = pStyle->usStartAt; -00321 pCurr->usListIndex = pStyle->usListIndex; -00322 pCurr->ucListLevel = pStyle->ucListLevel; -00323 pCurr->pNext = pValues; -00324 pValues = pCurr; -00325 usValue = pCurr->usValue; -00326 if (!pStyle->bNoRestart) { -00327 vRestartListValues(pStyle->usListIndex, pStyle->ucListLevel); -00328 } -00329 return usValue; -00330 } /* end of usGetListValue */ -