/* * rowlist.c * Copyright (C) 1998-2004 A.J. van Os; Released under GPL * * Description: * Build, read and destroy a list of Word table-row information */ #include #include #include "antiword.h" /* * Private structure to hide the way the information * is stored from the rest of the program */ typedef struct row_desc_tag { row_block_type tInfo; struct row_desc_tag *pNext; } row_desc_type; /* Variables needed to write the Row Information List */ static row_desc_type *pAnchor = NULL; static row_desc_type *pRowLast = NULL; /* Variable needed to read the Row Information List */ static row_desc_type *pRowCurrent = NULL; /* * vDestroyRowInfoList - destroy the Row Information List */ void vDestroyRowInfoList(void) { row_desc_type *pCurr, *pNext; DBG_MSG("vDestroyRowInfoList"); /* Free the Row Information List */ pCurr = pAnchor; while (pCurr != NULL) { pNext = pCurr->pNext; pCurr = xfree(pCurr); pCurr = pNext; } pAnchor = NULL; /* Reset all control variables */ pRowLast = NULL; pRowCurrent = NULL; } /* end of vDestroyRowInfoList */ /* * vAdd2RowInfoList - Add an element to the Row Information List */ void vAdd2RowInfoList(const row_block_type *pRowBlock) { row_desc_type *pListMember; short *psTmp; int iIndex; fail(pRowBlock == NULL); if (pRowBlock->ulFileOffsetStart == FC_INVALID || pRowBlock->ulFileOffsetEnd == FC_INVALID || pRowBlock->ulFileOffsetStart == pRowBlock->ulFileOffsetEnd) { DBG_HEX_C(pRowBlock->ulFileOffsetStart != FC_INVALID, pRowBlock->ulFileOffsetStart); DBG_HEX_C(pRowBlock->ulFileOffsetEnd != FC_INVALID, pRowBlock->ulFileOffsetEnd); return; } NO_DBG_HEX(pRowBlock->ulFileOffsetStart); NO_DBG_HEX(pRowBlock->ulFileOffsetEnd); NO_DBG_DEC(pRowBlock->ucNumberOfColumns); /* Create the new list member */ pListMember = xmalloc(sizeof(row_desc_type)); /* Fill the new list member */ pListMember->tInfo = *pRowBlock; pListMember->pNext = NULL; /* Correct the values where needed */ for (iIndex = 0, psTmp = pListMember->tInfo.asColumnWidth; iIndex < (int)pListMember->tInfo.ucNumberOfColumns; iIndex++, psTmp++) { if (*psTmp < 0) { *psTmp = 0; DBG_MSG("The column width was negative"); } } /* Add the new member to the list */ if (pAnchor == NULL) { pAnchor = pListMember; pRowCurrent = pListMember; } else { fail(pRowLast == NULL); pRowLast->pNext = pListMember; } pRowLast = pListMember; } /* end of vAdd2RowInfoList */ /* * Get the next item in the Row Information List */ const row_block_type * pGetNextRowInfoListItem(void) { const row_block_type *pItem; if (pRowCurrent == NULL) { return NULL; } pItem = &pRowCurrent->tInfo; pRowCurrent = pRowCurrent->pNext; return pItem; } /* end of pGetNextRowInfoListItem */