1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier * sectlist.c
3*25b329d5SDavid du Colombier * Copyright (C) 2001-2004 A.J. van Os; Released under GNU GPL
4f5736e95SDavid du Colombier *
5f5736e95SDavid du Colombier * Description:
6f5736e95SDavid du Colombier * Build, read and destroy list(s) of Word section information
7f5736e95SDavid du Colombier */
8f5736e95SDavid du Colombier
9f5736e95SDavid du Colombier #include <stddef.h>
10f5736e95SDavid du Colombier #include <string.h>
11f5736e95SDavid du Colombier #include "antiword.h"
12f5736e95SDavid du Colombier
13f5736e95SDavid du Colombier
14f5736e95SDavid du Colombier /*
15f5736e95SDavid du Colombier * Private structure to hide the way the information
16f5736e95SDavid du Colombier * is stored from the rest of the program
17f5736e95SDavid du Colombier */
18f5736e95SDavid du Colombier typedef struct section_mem_tag {
19f5736e95SDavid du Colombier section_block_type tInfo;
20*25b329d5SDavid du Colombier ULONG ulCharPos;
21f5736e95SDavid du Colombier struct section_mem_tag *pNext;
22f5736e95SDavid du Colombier } section_mem_type;
23f5736e95SDavid du Colombier
24f5736e95SDavid du Colombier /* Variables needed to write the Section Information List */
25f5736e95SDavid du Colombier static section_mem_type *pAnchor = NULL;
26f5736e95SDavid du Colombier static section_mem_type *pSectionLast = NULL;
27f5736e95SDavid du Colombier
28f5736e95SDavid du Colombier
29f5736e95SDavid du Colombier /*
30f5736e95SDavid du Colombier * vDestroySectionInfoList - destroy the Section Information List
31f5736e95SDavid du Colombier */
32f5736e95SDavid du Colombier void
vDestroySectionInfoList(void)33f5736e95SDavid du Colombier vDestroySectionInfoList(void)
34f5736e95SDavid du Colombier {
35f5736e95SDavid du Colombier section_mem_type *pCurr, *pNext;
36f5736e95SDavid du Colombier
37f5736e95SDavid du Colombier DBG_MSG("vDestroySectionInfoList");
38f5736e95SDavid du Colombier
39f5736e95SDavid du Colombier /* Free the Section Information List */
40f5736e95SDavid du Colombier pCurr = pAnchor;
41f5736e95SDavid du Colombier while (pCurr != NULL) {
42f5736e95SDavid du Colombier pNext = pCurr->pNext;
43f5736e95SDavid du Colombier pCurr = xfree(pCurr);
44f5736e95SDavid du Colombier pCurr = pNext;
45f5736e95SDavid du Colombier }
46f5736e95SDavid du Colombier pAnchor = NULL;
47f5736e95SDavid du Colombier /* Reset all control variables */
48f5736e95SDavid du Colombier pSectionLast = NULL;
49f5736e95SDavid du Colombier } /* end of vDestroySectionInfoList */
50f5736e95SDavid du Colombier
51f5736e95SDavid du Colombier /*
52f5736e95SDavid du Colombier * vAdd2SectionInfoList - Add an element to the Section Information List
53f5736e95SDavid du Colombier */
54f5736e95SDavid du Colombier void
vAdd2SectionInfoList(const section_block_type * pSection,ULONG ulCharPos)55*25b329d5SDavid du Colombier vAdd2SectionInfoList(const section_block_type *pSection, ULONG ulCharPos)
56f5736e95SDavid du Colombier {
57f5736e95SDavid du Colombier section_mem_type *pListMember;
58f5736e95SDavid du Colombier
59f5736e95SDavid du Colombier fail(pSection == NULL);
60f5736e95SDavid du Colombier
61f5736e95SDavid du Colombier /* Create list member */
62f5736e95SDavid du Colombier pListMember = xmalloc(sizeof(section_mem_type));
63f5736e95SDavid du Colombier /* Fill the list member */
64f5736e95SDavid du Colombier pListMember->tInfo = *pSection;
65*25b329d5SDavid du Colombier pListMember->ulCharPos = ulCharPos;
66f5736e95SDavid du Colombier pListMember->pNext = NULL;
67f5736e95SDavid du Colombier /* Add the new member to the list */
68f5736e95SDavid du Colombier if (pAnchor == NULL) {
69f5736e95SDavid du Colombier pAnchor = pListMember;
70f5736e95SDavid du Colombier } else {
71f5736e95SDavid du Colombier fail(pSectionLast == NULL);
72f5736e95SDavid du Colombier pSectionLast->pNext = pListMember;
73f5736e95SDavid du Colombier }
74f5736e95SDavid du Colombier pSectionLast = pListMember;
75f5736e95SDavid du Colombier } /* vAdd2SectionInfoList */
76f5736e95SDavid du Colombier
77f5736e95SDavid du Colombier /*
78f5736e95SDavid du Colombier * vGetDefaultSection - fill the section struct with default values
79f5736e95SDavid du Colombier */
80f5736e95SDavid du Colombier void
vGetDefaultSection(section_block_type * pSection)81f5736e95SDavid du Colombier vGetDefaultSection(section_block_type *pSection)
82f5736e95SDavid du Colombier {
83f5736e95SDavid du Colombier (void)memset(pSection, 0, sizeof(*pSection));
84f5736e95SDavid du Colombier pSection->bNewPage = TRUE;
85f5736e95SDavid du Colombier } /* end of vGetDefaultSection */
86f5736e95SDavid du Colombier
87f5736e95SDavid du Colombier /*
88f5736e95SDavid du Colombier * vDefault2SectionInfoList - Add a default to the Section Information List
89f5736e95SDavid du Colombier */
90f5736e95SDavid du Colombier void
vDefault2SectionInfoList(ULONG ulCharPos)91*25b329d5SDavid du Colombier vDefault2SectionInfoList(ULONG ulCharPos)
92f5736e95SDavid du Colombier {
93f5736e95SDavid du Colombier section_block_type tSection;
94f5736e95SDavid du Colombier
95f5736e95SDavid du Colombier vGetDefaultSection(&tSection);
96*25b329d5SDavid du Colombier vAdd2SectionInfoList(&tSection, ulCharPos);
97f5736e95SDavid du Colombier } /* end of vDefault2SectionInfoList */
98f5736e95SDavid du Colombier
99f5736e95SDavid du Colombier /*
100f5736e95SDavid du Colombier * pGetSectionInfo - get the section information
101f5736e95SDavid du Colombier */
102f5736e95SDavid du Colombier const section_block_type *
pGetSectionInfo(const section_block_type * pOld,ULONG ulCharPos)103*25b329d5SDavid du Colombier pGetSectionInfo(const section_block_type *pOld, ULONG ulCharPos)
104f5736e95SDavid du Colombier {
105f5736e95SDavid du Colombier const section_mem_type *pCurr;
106f5736e95SDavid du Colombier
107*25b329d5SDavid du Colombier if (pOld == NULL || ulCharPos == 0) {
108f5736e95SDavid du Colombier if (pAnchor == NULL) {
109f5736e95SDavid du Colombier /* There are no records, make one */
110f5736e95SDavid du Colombier vDefault2SectionInfoList(0);
111f5736e95SDavid du Colombier fail(pAnchor == NULL);
112f5736e95SDavid du Colombier }
113f5736e95SDavid du Colombier /* The first record */
114f5736e95SDavid du Colombier NO_DBG_MSG("First record");
115f5736e95SDavid du Colombier return &pAnchor->tInfo;
116f5736e95SDavid du Colombier }
117*25b329d5SDavid du Colombier
118*25b329d5SDavid du Colombier NO_DBG_HEX(ulCharPos);
119f5736e95SDavid du Colombier for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) {
120*25b329d5SDavid du Colombier NO_DBG_HEX(pCurr->ulCharPos);
121*25b329d5SDavid du Colombier if (ulCharPos == pCurr->ulCharPos ||
122*25b329d5SDavid du Colombier ulCharPos + 1 == pCurr->ulCharPos) {
123*25b329d5SDavid du Colombier NO_DBG_HEX(pCurr->ulCharPos);
124f5736e95SDavid du Colombier return &pCurr->tInfo;
125f5736e95SDavid du Colombier }
126f5736e95SDavid du Colombier }
127f5736e95SDavid du Colombier return pOld;
128f5736e95SDavid du Colombier } /* end of pGetSectionInfo */
129*25b329d5SDavid du Colombier
130*25b329d5SDavid du Colombier /*
131*25b329d5SDavid du Colombier * tGetNumberOfSections - get the number of sections
132*25b329d5SDavid du Colombier */
133*25b329d5SDavid du Colombier size_t
tGetNumberOfSections(void)134*25b329d5SDavid du Colombier tGetNumberOfSections(void)
135*25b329d5SDavid du Colombier {
136*25b329d5SDavid du Colombier const section_mem_type *pCurr;
137*25b329d5SDavid du Colombier size_t tCounter;
138*25b329d5SDavid du Colombier
139*25b329d5SDavid du Colombier for (tCounter = 0, pCurr = pAnchor;
140*25b329d5SDavid du Colombier pCurr != NULL;
141*25b329d5SDavid du Colombier tCounter++, pCurr = pCurr->pNext)
142*25b329d5SDavid du Colombier ; /* Empty */
143*25b329d5SDavid du Colombier return tCounter;
144*25b329d5SDavid du Colombier } /* end of tGetNumberOfSections */
145*25b329d5SDavid du Colombier
146*25b329d5SDavid du Colombier /*
147*25b329d5SDavid du Colombier * ucGetSepHdrFtrSpecification - get the Heder/footer specification
148*25b329d5SDavid du Colombier */
149*25b329d5SDavid du Colombier UCHAR
ucGetSepHdrFtrSpecification(size_t tSectionNumber)150*25b329d5SDavid du Colombier ucGetSepHdrFtrSpecification(size_t tSectionNumber)
151*25b329d5SDavid du Colombier {
152*25b329d5SDavid du Colombier const section_mem_type *pCurr;
153*25b329d5SDavid du Colombier size_t tIndex;
154*25b329d5SDavid du Colombier
155*25b329d5SDavid du Colombier for (tIndex = 0, pCurr = pAnchor;
156*25b329d5SDavid du Colombier tIndex < tSectionNumber && pCurr != NULL;
157*25b329d5SDavid du Colombier tIndex++, pCurr = pCurr->pNext)
158*25b329d5SDavid du Colombier ; /* Empty */
159*25b329d5SDavid du Colombier if (pCurr == NULL) {
160*25b329d5SDavid du Colombier DBG_DEC(tSectionNumber);
161*25b329d5SDavid du Colombier DBG_FIXME();
162*25b329d5SDavid du Colombier return 0x00;
163*25b329d5SDavid du Colombier }
164*25b329d5SDavid du Colombier return pCurr->tInfo.ucHdrFtrSpecification;
165*25b329d5SDavid du Colombier } /* end of ucGetSepHdrFtrSpecification */
166