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