xref: /plan9-contrib/sys/src/cmd/aux/antiword/pictlist.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
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 Colombier vDestroyPictInfoList(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 Colombier vAdd2PictInfoList(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 Colombier ulGetPictInfoListItem(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