mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
/*
|
|
* 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 <stdlib.h>
|
|
#include <string.h>
|
|
#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 __thread row_desc_type *pAnchor = NULL;
|
|
static __thread row_desc_type *pRowLast = NULL;
|
|
/* Variable needed to read the Row Information List */
|
|
static __thread 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 */
|