1f5736e95SDavid du Colombier /* 2f5736e95SDavid du Colombier * pictlist.c 3*25b329d5SDavid du Colombier * Copyright (C) 2000-2004 A.J. van Os; Released under GNU GPL 4f5736e95SDavid du Colombier * 5f5736e95SDavid du Colombier * Description: 6f5736e95SDavid du Colombier * Build, read and destroy a list of Word picture information 7f5736e95SDavid du Colombier */ 8f5736e95SDavid du Colombier 9f5736e95SDavid du Colombier #include <stdlib.h> 10f5736e95SDavid du Colombier #include "antiword.h" 11f5736e95SDavid du Colombier 12f5736e95SDavid du Colombier 13*25b329d5SDavid du Colombier /* 14*25b329d5SDavid du Colombier * Private structure to hide the way the information 15*25b329d5SDavid du Colombier * is stored from the rest of the program 16*25b329d5SDavid du Colombier */ 17*25b329d5SDavid du Colombier typedef struct picture_mem_tag { 18*25b329d5SDavid du Colombier picture_block_type tInfo; 19*25b329d5SDavid du Colombier struct picture_mem_tag *pNext; 20*25b329d5SDavid du Colombier } picture_mem_type; 21*25b329d5SDavid du Colombier 22f5736e95SDavid du Colombier /* Variables needed to write the Picture Information List */ 23*25b329d5SDavid du Colombier static picture_mem_type *pAnchor = NULL; 24*25b329d5SDavid du Colombier static picture_mem_type *pPictureLast = NULL; 25f5736e95SDavid du Colombier 26f5736e95SDavid du Colombier 27f5736e95SDavid du Colombier /* 28f5736e95SDavid du Colombier * vDestroyPictInfoList - destroy the Picture Information List 29f5736e95SDavid du Colombier */ 30f5736e95SDavid du Colombier void vDestroyPictInfoList(void)31f5736e95SDavid du ColombiervDestroyPictInfoList(void) 32f5736e95SDavid du Colombier { 33*25b329d5SDavid du Colombier picture_mem_type *pCurr, *pNext; 34f5736e95SDavid du Colombier 35f5736e95SDavid du Colombier DBG_MSG("vDestroyPictInfoList"); 36f5736e95SDavid du Colombier 37f5736e95SDavid du Colombier /* Free the Picture Information List */ 38f5736e95SDavid du Colombier pCurr = pAnchor; 39f5736e95SDavid du Colombier while (pCurr != NULL) { 40f5736e95SDavid du Colombier pNext = pCurr->pNext; 41f5736e95SDavid du Colombier pCurr = xfree(pCurr); 42f5736e95SDavid du Colombier pCurr = pNext; 43f5736e95SDavid du Colombier } 44f5736e95SDavid du Colombier pAnchor = NULL; 45f5736e95SDavid du Colombier /* Reset all control variables */ 46f5736e95SDavid du Colombier pPictureLast = NULL; 47f5736e95SDavid du Colombier } /* end of vDestroyPictInfoList */ 48f5736e95SDavid du Colombier 49f5736e95SDavid du Colombier /* 50f5736e95SDavid du Colombier * vAdd2PictInfoList - Add an element to the Picture Information List 51f5736e95SDavid du Colombier */ 52f5736e95SDavid du Colombier void vAdd2PictInfoList(const picture_block_type * pPictureBlock)53f5736e95SDavid du ColombiervAdd2PictInfoList(const picture_block_type *pPictureBlock) 54f5736e95SDavid du Colombier { 55*25b329d5SDavid du Colombier picture_mem_type *pListMember; 56f5736e95SDavid du Colombier 57f5736e95SDavid du Colombier fail(pPictureBlock == NULL); 58f5736e95SDavid du Colombier 59f5736e95SDavid du Colombier NO_DBG_MSG("bAdd2PictInfoList"); 60f5736e95SDavid du Colombier 61f5736e95SDavid du Colombier if (pPictureBlock->ulFileOffset == FC_INVALID) { 62f5736e95SDavid du Colombier /* 63f5736e95SDavid du Colombier * This offset is really past the end of the file, 64f5736e95SDavid du Colombier * so don't waste any memory by storing it. 65f5736e95SDavid du Colombier */ 66f5736e95SDavid du Colombier return; 67f5736e95SDavid du Colombier } 68f5736e95SDavid du Colombier if (pPictureBlock->ulFileOffsetPicture == FC_INVALID) { 69f5736e95SDavid du Colombier /* 70f5736e95SDavid du Colombier * The place where this picture is supposed to be stored 71f5736e95SDavid du Colombier * doesn't exist. 72f5736e95SDavid du Colombier */ 73f5736e95SDavid du Colombier return; 74f5736e95SDavid du Colombier } 75f5736e95SDavid du Colombier 76f5736e95SDavid du Colombier NO_DBG_HEX(pPictureBlock->ulFileOffset); 77f5736e95SDavid du Colombier NO_DBG_HEX(pPictureBlock->ulFileOffsetPicture); 78f5736e95SDavid du Colombier NO_DBG_HEX(pPictureBlock->ulPictureOffset); 79f5736e95SDavid du Colombier 80f5736e95SDavid du Colombier /* Create list member */ 81*25b329d5SDavid du Colombier pListMember = xmalloc(sizeof(picture_mem_type)); 82f5736e95SDavid du Colombier /* Fill the list member */ 83f5736e95SDavid du Colombier pListMember->tInfo = *pPictureBlock; 84f5736e95SDavid du Colombier pListMember->pNext = NULL; 85f5736e95SDavid du Colombier /* Add the new member to the list */ 86f5736e95SDavid du Colombier if (pAnchor == NULL) { 87f5736e95SDavid du Colombier pAnchor = pListMember; 88f5736e95SDavid du Colombier } else { 89f5736e95SDavid du Colombier fail(pPictureLast == NULL); 90f5736e95SDavid du Colombier pPictureLast->pNext = pListMember; 91f5736e95SDavid du Colombier } 92f5736e95SDavid du Colombier pPictureLast = pListMember; 93f5736e95SDavid du Colombier } /* end of vAdd2PictInfoList */ 94f5736e95SDavid du Colombier 95f5736e95SDavid du Colombier /* 96f5736e95SDavid du Colombier * Get the info with the given file offset from the Picture Information List 97f5736e95SDavid du Colombier */ 98f5736e95SDavid du Colombier ULONG ulGetPictInfoListItem(ULONG ulFileOffset)99f5736e95SDavid du ColombierulGetPictInfoListItem(ULONG ulFileOffset) 100f5736e95SDavid du Colombier { 101*25b329d5SDavid du Colombier picture_mem_type *pCurr; 102f5736e95SDavid du Colombier 103f5736e95SDavid du Colombier for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) { 104f5736e95SDavid du Colombier if (pCurr->tInfo.ulFileOffset == ulFileOffset) { 105f5736e95SDavid du Colombier return pCurr->tInfo.ulFileOffsetPicture; 106f5736e95SDavid du Colombier } 107f5736e95SDavid du Colombier } 108f5736e95SDavid du Colombier return FC_INVALID; 109f5736e95SDavid du Colombier } /* end of ulGetPictInfoListItem */ 110