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