/*
* pictlist.c
* Copyright (C) 2000-2004 A.J. van Os; Released under GNU GPL
*
* Description:
* Build, read and destroy a list of Word picture information
*/

#include <stdlib.h>
#include "antiword.h"


/*
* Private structure to hide the way the information
* is stored from the rest of the program
*/
typedef struct picture_mem_tag {
       picture_block_type      tInfo;
       struct picture_mem_tag *pNext;
} picture_mem_type;

/* Variables needed to write the Picture Information List */
static picture_mem_type *pAnchor = NULL;
static picture_mem_type *pPictureLast = NULL;


/*
* vDestroyPictInfoList - destroy the Picture Information List
*/
void
vDestroyPictInfoList(void)
{
       picture_mem_type        *pCurr, *pNext;

       DBG_MSG("vDestroyPictInfoList");

       /* Free the Picture Information List */
       pCurr = pAnchor;
       while (pCurr != NULL) {
               pNext = pCurr->pNext;
               pCurr = xfree(pCurr);
               pCurr = pNext;
       }
       pAnchor = NULL;
       /* Reset all control variables */
       pPictureLast = NULL;
} /* end of vDestroyPictInfoList */

/*
* vAdd2PictInfoList - Add an element to the Picture Information List
*/
void
vAdd2PictInfoList(const picture_block_type *pPictureBlock)
{
       picture_mem_type        *pListMember;

       fail(pPictureBlock == NULL);

       NO_DBG_MSG("bAdd2PictInfoList");

       if (pPictureBlock->ulFileOffset == FC_INVALID) {
               /*
                * This offset is really past the end of the file,
                * so don't waste any memory by storing it.
                */
               return;
       }
       if (pPictureBlock->ulFileOffsetPicture == FC_INVALID) {
               /*
                * The place where this picture is supposed to be stored
                * doesn't exist.
                */
               return;
       }

       NO_DBG_HEX(pPictureBlock->ulFileOffset);
       NO_DBG_HEX(pPictureBlock->ulFileOffsetPicture);
       NO_DBG_HEX(pPictureBlock->ulPictureOffset);

       /* Create list member */
       pListMember = xmalloc(sizeof(picture_mem_type));
       /* Fill the list member */
       pListMember->tInfo = *pPictureBlock;
       pListMember->pNext = NULL;
       /* Add the new member to the list */
       if (pAnchor == NULL) {
               pAnchor = pListMember;
       } else {
               fail(pPictureLast == NULL);
               pPictureLast->pNext = pListMember;
       }
       pPictureLast = pListMember;
} /* end of vAdd2PictInfoList */

/*
* Get the info with the given file offset from the Picture Information List
*/
ULONG
ulGetPictInfoListItem(ULONG ulFileOffset)
{
       picture_mem_type        *pCurr;

       for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) {
               if (pCurr->tInfo.ulFileOffset == ulFileOffset) {
                       return pCurr->tInfo.ulFileOffsetPicture;
               }
       }
       return FC_INVALID;
} /* end of ulGetPictInfoListItem */