Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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 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 */