xref: /plan9/sys/src/cmd/aux/antiword/hdrftrlist.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1*25b329d5SDavid du Colombier /*
2*25b329d5SDavid du Colombier  * hdrftrlist.c
3*25b329d5SDavid du Colombier  * Copyright (C) 2004,2005 A.J. van Os; Released under GNU GPL
4*25b329d5SDavid du Colombier  *
5*25b329d5SDavid du Colombier  * Description:
6*25b329d5SDavid du Colombier  * Build, read and destroy list(s) of Word Header/footer information
7*25b329d5SDavid du Colombier  */
8*25b329d5SDavid du Colombier 
9*25b329d5SDavid du Colombier #include <string.h>
10*25b329d5SDavid du Colombier #include "antiword.h"
11*25b329d5SDavid du Colombier 
12*25b329d5SDavid du Colombier 
13*25b329d5SDavid du Colombier #define HDR_EVEN_PAGES	0
14*25b329d5SDavid du Colombier #define HDR_ODD_PAGES	1
15*25b329d5SDavid du Colombier #define FTR_EVEN_PAGES	2
16*25b329d5SDavid du Colombier #define FTR_ODD_PAGES	3
17*25b329d5SDavid du Colombier #define HDR_FIRST_PAGE	4
18*25b329d5SDavid du Colombier #define FTR_FIRST_PAGE	5
19*25b329d5SDavid du Colombier 
20*25b329d5SDavid du Colombier /*
21*25b329d5SDavid du Colombier  * Private structures to hide the way the information
22*25b329d5SDavid du Colombier  * is stored from the rest of the program
23*25b329d5SDavid du Colombier  */
24*25b329d5SDavid du Colombier typedef struct hdrftr_local_tag {
25*25b329d5SDavid du Colombier 	hdrftr_block_type	tInfo;
26*25b329d5SDavid du Colombier 	ULONG			ulCharPosStart;
27*25b329d5SDavid du Colombier 	ULONG			ulCharPosNext;
28*25b329d5SDavid du Colombier 	BOOL			bUseful;
29*25b329d5SDavid du Colombier 	BOOL			bTextOriginal;
30*25b329d5SDavid du Colombier } hdrftr_local_type;
31*25b329d5SDavid du Colombier typedef struct hdrftr_mem_tag {
32*25b329d5SDavid du Colombier 	hdrftr_local_type	atElement[6];
33*25b329d5SDavid du Colombier } hdrftr_mem_type;
34*25b329d5SDavid du Colombier 
35*25b329d5SDavid du Colombier /* Variables needed to write the Header/footer Information List */
36*25b329d5SDavid du Colombier static hdrftr_mem_type	*pHdrFtrList = NULL;
37*25b329d5SDavid du Colombier static size_t		tHdrFtrLen = 0;
38*25b329d5SDavid du Colombier 
39*25b329d5SDavid du Colombier 
40*25b329d5SDavid du Colombier /*
41*25b329d5SDavid du Colombier  * vDestroyHdrFtrInfoList - destroy the Header/footer Information List
42*25b329d5SDavid du Colombier  */
43*25b329d5SDavid du Colombier void
vDestroyHdrFtrInfoList(void)44*25b329d5SDavid du Colombier vDestroyHdrFtrInfoList(void)
45*25b329d5SDavid du Colombier {
46*25b329d5SDavid du Colombier 	hdrftr_mem_type *pRecord;
47*25b329d5SDavid du Colombier 	output_type	*pCurr, *pNext;
48*25b329d5SDavid du Colombier 	size_t		tHdrFtr, tIndex;
49*25b329d5SDavid du Colombier 
50*25b329d5SDavid du Colombier 	DBG_MSG("vDestroyHdrFtrInfoList");
51*25b329d5SDavid du Colombier 
52*25b329d5SDavid du Colombier 	/* Free the Header/footer Information List */
53*25b329d5SDavid du Colombier 	for (tHdrFtr = 0; tHdrFtr < tHdrFtrLen; tHdrFtr++) {
54*25b329d5SDavid du Colombier 		pRecord = pHdrFtrList + tHdrFtr;
55*25b329d5SDavid du Colombier 		for (tIndex = 0;
56*25b329d5SDavid du Colombier 		     tIndex < elementsof(pRecord->atElement);
57*25b329d5SDavid du Colombier 		     tIndex++) {
58*25b329d5SDavid du Colombier 			if (!pRecord->atElement[tIndex].bTextOriginal) {
59*25b329d5SDavid du Colombier 				continue;
60*25b329d5SDavid du Colombier 			}
61*25b329d5SDavid du Colombier 			pCurr = pRecord->atElement[tIndex].tInfo.pText;
62*25b329d5SDavid du Colombier 			while (pCurr != NULL) {
63*25b329d5SDavid du Colombier 				pCurr->szStorage = xfree(pCurr->szStorage);
64*25b329d5SDavid du Colombier 				pNext = pCurr->pNext;
65*25b329d5SDavid du Colombier 				pCurr = xfree(pCurr);
66*25b329d5SDavid du Colombier 				pCurr = pNext;
67*25b329d5SDavid du Colombier 			}
68*25b329d5SDavid du Colombier 		}
69*25b329d5SDavid du Colombier 	}
70*25b329d5SDavid du Colombier 	pHdrFtrList = xfree(pHdrFtrList);
71*25b329d5SDavid du Colombier 	/* Reset all control variables */
72*25b329d5SDavid du Colombier 	tHdrFtrLen = 0;
73*25b329d5SDavid du Colombier } /* end of vDestroyHdrFtrInfoList */
74*25b329d5SDavid du Colombier 
75*25b329d5SDavid du Colombier /*
76*25b329d5SDavid du Colombier  * vCreat8HdrFtrInfoList - Create the Header/footer Information List
77*25b329d5SDavid du Colombier  */
78*25b329d5SDavid du Colombier void
vCreat8HdrFtrInfoList(const ULONG * aulCharPos,size_t tLength)79*25b329d5SDavid du Colombier vCreat8HdrFtrInfoList(const ULONG *aulCharPos, size_t tLength)
80*25b329d5SDavid du Colombier {
81*25b329d5SDavid du Colombier 	hdrftr_mem_type	*pListMember;
82*25b329d5SDavid du Colombier 	size_t	tHdrFtr, tIndex, tMainIndex;
83*25b329d5SDavid du Colombier 
84*25b329d5SDavid du Colombier 	fail(aulCharPos == NULL);
85*25b329d5SDavid du Colombier 
86*25b329d5SDavid du Colombier 	DBG_DEC(tLength);
87*25b329d5SDavid du Colombier 	if (tLength <= 1) {
88*25b329d5SDavid du Colombier 		return;
89*25b329d5SDavid du Colombier 	}
90*25b329d5SDavid du Colombier 	tHdrFtrLen = tLength / 12;
91*25b329d5SDavid du Colombier 	if (tLength % 12 != 0 && tLength % 12 != 1) {
92*25b329d5SDavid du Colombier 		tHdrFtrLen++;
93*25b329d5SDavid du Colombier 	}
94*25b329d5SDavid du Colombier 	DBG_DEC(tHdrFtrLen);
95*25b329d5SDavid du Colombier 
96*25b329d5SDavid du Colombier 	pHdrFtrList = xcalloc(tHdrFtrLen, sizeof(hdrftr_mem_type));
97*25b329d5SDavid du Colombier 
98*25b329d5SDavid du Colombier 	for (tHdrFtr = 0; tHdrFtr < tHdrFtrLen; tHdrFtr++) {
99*25b329d5SDavid du Colombier 		pListMember = pHdrFtrList + tHdrFtr;
100*25b329d5SDavid du Colombier 		for (tIndex = 0, tMainIndex = tHdrFtr * 12;
101*25b329d5SDavid du Colombier 		     tIndex < 6 && tMainIndex < tLength;
102*25b329d5SDavid du Colombier 		     tIndex++, tMainIndex++) {
103*25b329d5SDavid du Colombier 			pListMember->atElement[tIndex].tInfo.pText = NULL;
104*25b329d5SDavid du Colombier 			pListMember->atElement[tIndex].ulCharPosStart =
105*25b329d5SDavid du Colombier 						aulCharPos[tMainIndex];
106*25b329d5SDavid du Colombier 			if (tMainIndex + 1 < tLength) {
107*25b329d5SDavid du Colombier 				pListMember->atElement[tIndex].ulCharPosNext =
108*25b329d5SDavid du Colombier 					aulCharPos[tMainIndex + 1];
109*25b329d5SDavid du Colombier 			} else {
110*25b329d5SDavid du Colombier 				pListMember->atElement[tIndex].ulCharPosNext =
111*25b329d5SDavid du Colombier 					aulCharPos[tMainIndex];
112*25b329d5SDavid du Colombier 			}
113*25b329d5SDavid du Colombier 		}
114*25b329d5SDavid du Colombier 	}
115*25b329d5SDavid du Colombier } /* end of vCreat8HdrFtrInfoList */
116*25b329d5SDavid du Colombier 
117*25b329d5SDavid du Colombier /*
118*25b329d5SDavid du Colombier  * vCreat6HdrFtrInfoList - Create the Header/footer Information List
119*25b329d5SDavid du Colombier  */
120*25b329d5SDavid du Colombier void
vCreat6HdrFtrInfoList(const ULONG * aulCharPos,size_t tLength)121*25b329d5SDavid du Colombier vCreat6HdrFtrInfoList(const ULONG *aulCharPos, size_t tLength)
122*25b329d5SDavid du Colombier {
123*25b329d5SDavid du Colombier 	static const size_t	atIndex[] =
124*25b329d5SDavid du Colombier 		{ SIZE_T_MAX, SIZE_T_MAX, FTR_FIRST_PAGE, HDR_FIRST_PAGE,
125*25b329d5SDavid du Colombier 		  FTR_ODD_PAGES, FTR_EVEN_PAGES, HDR_ODD_PAGES, HDR_EVEN_PAGES,
126*25b329d5SDavid du Colombier 		};
127*25b329d5SDavid du Colombier 	hdrftr_mem_type	*pListMember;
128*25b329d5SDavid du Colombier 	size_t	tHdrFtr, tTmp, tIndex, tMainIndex, tBit;
129*25b329d5SDavid du Colombier 	UCHAR	ucDopSpecification, ucSepSpecification;
130*25b329d5SDavid du Colombier 
131*25b329d5SDavid du Colombier 	fail(aulCharPos == NULL);
132*25b329d5SDavid du Colombier 
133*25b329d5SDavid du Colombier 	DBG_DEC(tLength);
134*25b329d5SDavid du Colombier 	if (tLength <= 1) {
135*25b329d5SDavid du Colombier 		return;
136*25b329d5SDavid du Colombier 	}
137*25b329d5SDavid du Colombier 	tHdrFtrLen = tGetNumberOfSections();
138*25b329d5SDavid du Colombier 	if (tHdrFtrLen == 0) {
139*25b329d5SDavid du Colombier 		tHdrFtrLen = 1;
140*25b329d5SDavid du Colombier 	}
141*25b329d5SDavid du Colombier 	DBG_DEC(tHdrFtrLen);
142*25b329d5SDavid du Colombier 
143*25b329d5SDavid du Colombier 	pHdrFtrList = xcalloc(tHdrFtrLen, sizeof(hdrftr_mem_type));
144*25b329d5SDavid du Colombier 
145*25b329d5SDavid du Colombier 	/* Get the start index in aulCharPos */
146*25b329d5SDavid du Colombier 	ucDopSpecification = ucGetDopHdrFtrSpecification();
147*25b329d5SDavid du Colombier 	DBG_HEX(ucDopSpecification & 0xe0);
148*25b329d5SDavid du Colombier 	tMainIndex = 0;
149*25b329d5SDavid du Colombier 	for (tBit = 7; tBit >= 5; tBit--) {
150*25b329d5SDavid du Colombier 		if ((ucDopSpecification & BIT(tBit)) != 0) {
151*25b329d5SDavid du Colombier 			tMainIndex++;
152*25b329d5SDavid du Colombier 		}
153*25b329d5SDavid du Colombier 	}
154*25b329d5SDavid du Colombier 	DBG_DEC(tMainIndex);
155*25b329d5SDavid du Colombier 
156*25b329d5SDavid du Colombier 	for (tHdrFtr = 0; tHdrFtr < tHdrFtrLen; tHdrFtr++) {
157*25b329d5SDavid du Colombier 		ucSepSpecification = ucGetSepHdrFtrSpecification(tHdrFtr);
158*25b329d5SDavid du Colombier 		DBG_HEX(ucSepSpecification & 0xfc);
159*25b329d5SDavid du Colombier 		pListMember = pHdrFtrList + tHdrFtr;
160*25b329d5SDavid du Colombier 		for (tTmp = 0;
161*25b329d5SDavid du Colombier 		     tTmp < elementsof(pListMember->atElement);
162*25b329d5SDavid du Colombier 		     tTmp++) {
163*25b329d5SDavid du Colombier 			pListMember->atElement[tTmp].tInfo.pText = NULL;
164*25b329d5SDavid du Colombier 		}
165*25b329d5SDavid du Colombier 		for (tBit = 7; tBit >= 2; tBit--) {
166*25b329d5SDavid du Colombier 			if (tMainIndex >= tLength) {
167*25b329d5SDavid du Colombier 				break;
168*25b329d5SDavid du Colombier 			}
169*25b329d5SDavid du Colombier 			if ((ucSepSpecification & BIT(tBit)) == 0) {
170*25b329d5SDavid du Colombier 				continue;
171*25b329d5SDavid du Colombier 			}
172*25b329d5SDavid du Colombier 			tIndex = atIndex[tBit];
173*25b329d5SDavid du Colombier 			fail(tIndex >= 6);
174*25b329d5SDavid du Colombier 			pListMember->atElement[tIndex].ulCharPosStart =
175*25b329d5SDavid du Colombier 				aulCharPos[tMainIndex];
176*25b329d5SDavid du Colombier 			if (tMainIndex + 1 < tLength) {
177*25b329d5SDavid du Colombier 				pListMember->atElement[tIndex].ulCharPosNext =
178*25b329d5SDavid du Colombier 					aulCharPos[tMainIndex + 1];
179*25b329d5SDavid du Colombier 			} else {
180*25b329d5SDavid du Colombier 				pListMember->atElement[tIndex].ulCharPosNext =
181*25b329d5SDavid du Colombier 					aulCharPos[tMainIndex];
182*25b329d5SDavid du Colombier 			}
183*25b329d5SDavid du Colombier 			tMainIndex++;
184*25b329d5SDavid du Colombier 		}
185*25b329d5SDavid du Colombier 	}
186*25b329d5SDavid du Colombier } /* end of vCreat6HdrFtrInfoList */
187*25b329d5SDavid du Colombier 
188*25b329d5SDavid du Colombier /*
189*25b329d5SDavid du Colombier  * vCreat2HdrFtrInfoList - Create the Header/footer Information List
190*25b329d5SDavid du Colombier  */
191*25b329d5SDavid du Colombier void
vCreat2HdrFtrInfoList(const ULONG * aulCharPos,size_t tLength)192*25b329d5SDavid du Colombier vCreat2HdrFtrInfoList(const ULONG *aulCharPos, size_t tLength)
193*25b329d5SDavid du Colombier {
194*25b329d5SDavid du Colombier 	vCreat6HdrFtrInfoList(aulCharPos, tLength);
195*25b329d5SDavid du Colombier } /* end of vCreat2HdrFtrInfoList */
196*25b329d5SDavid du Colombier 
197*25b329d5SDavid du Colombier /*
198*25b329d5SDavid du Colombier  * pGetHdrFtrInfo - get the Header/footer information
199*25b329d5SDavid du Colombier  */
200*25b329d5SDavid du Colombier const hdrftr_block_type *
pGetHdrFtrInfo(int iSectionIndex,BOOL bWantHeader,BOOL bOddPage,BOOL bFirstInSection)201*25b329d5SDavid du Colombier pGetHdrFtrInfo(int iSectionIndex,
202*25b329d5SDavid du Colombier 	BOOL bWantHeader, BOOL bOddPage, BOOL bFirstInSection)
203*25b329d5SDavid du Colombier {
204*25b329d5SDavid du Colombier 	hdrftr_mem_type	*pCurr;
205*25b329d5SDavid du Colombier 
206*25b329d5SDavid du Colombier 	fail(iSectionIndex < 0);
207*25b329d5SDavid du Colombier 	fail(pHdrFtrList == NULL && tHdrFtrLen != 0);
208*25b329d5SDavid du Colombier 
209*25b329d5SDavid du Colombier 	if (pHdrFtrList == NULL || tHdrFtrLen == 0) {
210*25b329d5SDavid du Colombier 		/* No information */
211*25b329d5SDavid du Colombier 		return NULL;
212*25b329d5SDavid du Colombier 	}
213*25b329d5SDavid du Colombier 
214*25b329d5SDavid du Colombier 	if (iSectionIndex < 0) {
215*25b329d5SDavid du Colombier 		iSectionIndex = 0;
216*25b329d5SDavid du Colombier 	} else if (iSectionIndex >= (int)tHdrFtrLen) {
217*25b329d5SDavid du Colombier 		iSectionIndex = (int)(tHdrFtrLen - 1);
218*25b329d5SDavid du Colombier 	}
219*25b329d5SDavid du Colombier 
220*25b329d5SDavid du Colombier 	pCurr = pHdrFtrList + iSectionIndex;
221*25b329d5SDavid du Colombier 
222*25b329d5SDavid du Colombier 	if (bFirstInSection) {
223*25b329d5SDavid du Colombier 		if (bWantHeader) {
224*25b329d5SDavid du Colombier 			return &pCurr->atElement[HDR_FIRST_PAGE].tInfo;
225*25b329d5SDavid du Colombier 		} else {
226*25b329d5SDavid du Colombier 			return &pCurr->atElement[FTR_FIRST_PAGE].tInfo;
227*25b329d5SDavid du Colombier 		}
228*25b329d5SDavid du Colombier 	} else {
229*25b329d5SDavid du Colombier 		if (bWantHeader) {
230*25b329d5SDavid du Colombier 			if (bOddPage) {
231*25b329d5SDavid du Colombier 				return &pCurr->atElement[HDR_ODD_PAGES].tInfo;
232*25b329d5SDavid du Colombier 			} else {
233*25b329d5SDavid du Colombier 				return &pCurr->atElement[HDR_EVEN_PAGES].tInfo;
234*25b329d5SDavid du Colombier 			}
235*25b329d5SDavid du Colombier 		} else {
236*25b329d5SDavid du Colombier 			if (bOddPage) {
237*25b329d5SDavid du Colombier 				return &pCurr->atElement[FTR_ODD_PAGES].tInfo;
238*25b329d5SDavid du Colombier 			} else {
239*25b329d5SDavid du Colombier 				return &pCurr->atElement[FTR_EVEN_PAGES].tInfo;
240*25b329d5SDavid du Colombier 			}
241*25b329d5SDavid du Colombier 		}
242*25b329d5SDavid du Colombier 	}
243*25b329d5SDavid du Colombier } /* end of pGetHdrFtrInfo */
244*25b329d5SDavid du Colombier 
245*25b329d5SDavid du Colombier /*
246*25b329d5SDavid du Colombier  * lComputeHdrFtrHeight - compute the height of a header or footer
247*25b329d5SDavid du Colombier  *
248*25b329d5SDavid du Colombier  * Returns the height in DrawUnits
249*25b329d5SDavid du Colombier  */
250*25b329d5SDavid du Colombier static long
lComputeHdrFtrHeight(const output_type * pAnchor)251*25b329d5SDavid du Colombier lComputeHdrFtrHeight(const output_type *pAnchor)
252*25b329d5SDavid du Colombier {
253*25b329d5SDavid du Colombier 	const output_type *pCurr;
254*25b329d5SDavid du Colombier 	long	lTotal;
255*25b329d5SDavid du Colombier 	USHORT	usFontSizeMax;
256*25b329d5SDavid du Colombier 
257*25b329d5SDavid du Colombier 	lTotal = 0;
258*25b329d5SDavid du Colombier 	usFontSizeMax = 0;
259*25b329d5SDavid du Colombier 	for (pCurr = pAnchor; pCurr != NULL; pCurr = pCurr->pNext) {
260*25b329d5SDavid du Colombier 		if (pCurr->tNextFree == 1) {
261*25b329d5SDavid du Colombier 			if (pCurr->szStorage[0] == PAR_END) {
262*25b329d5SDavid du Colombier 				/* End of a paragraph */
263*25b329d5SDavid du Colombier 				lTotal += lComputeLeading(usFontSizeMax);
264*25b329d5SDavid du Colombier 				lTotal += lMilliPoints2DrawUnits(
265*25b329d5SDavid du Colombier 						(long)pCurr->usFontSize * 200);
266*25b329d5SDavid du Colombier 				usFontSizeMax = 0;
267*25b329d5SDavid du Colombier 				continue;
268*25b329d5SDavid du Colombier 			}
269*25b329d5SDavid du Colombier 			if (pCurr->szStorage[0] == HARD_RETURN) {
270*25b329d5SDavid du Colombier 				/* End of a line */
271*25b329d5SDavid du Colombier 				lTotal += lComputeLeading(usFontSizeMax);
272*25b329d5SDavid du Colombier 				usFontSizeMax = 0;
273*25b329d5SDavid du Colombier 				continue;
274*25b329d5SDavid du Colombier 			}
275*25b329d5SDavid du Colombier 		}
276*25b329d5SDavid du Colombier 		if (pCurr->usFontSize > usFontSizeMax) {
277*25b329d5SDavid du Colombier 			usFontSizeMax = pCurr->usFontSize;
278*25b329d5SDavid du Colombier 		}
279*25b329d5SDavid du Colombier 	}
280*25b329d5SDavid du Colombier 	if (usFontSizeMax != 0) {
281*25b329d5SDavid du Colombier 		/* Height of the last paragraph */
282*25b329d5SDavid du Colombier 		lTotal += lComputeLeading(usFontSizeMax);
283*25b329d5SDavid du Colombier 	}
284*25b329d5SDavid du Colombier 	return lTotal;
285*25b329d5SDavid du Colombier } /* end of lComputeHdrFtrHeight */
286*25b329d5SDavid du Colombier 
287*25b329d5SDavid du Colombier /*
288*25b329d5SDavid du Colombier  * vPrepareHdrFtrText - prepare the header/footer text
289*25b329d5SDavid du Colombier  */
290*25b329d5SDavid du Colombier void
vPrepareHdrFtrText(FILE * pFile)291*25b329d5SDavid du Colombier vPrepareHdrFtrText(FILE *pFile)
292*25b329d5SDavid du Colombier {
293*25b329d5SDavid du Colombier 	hdrftr_mem_type		*pCurr, *pPrev;
294*25b329d5SDavid du Colombier 	hdrftr_local_type	*pTmp;
295*25b329d5SDavid du Colombier 	output_type		*pText;
296*25b329d5SDavid du Colombier 	size_t		tHdrFtr, tIndex;
297*25b329d5SDavid du Colombier 
298*25b329d5SDavid du Colombier 	fail(pFile == NULL);
299*25b329d5SDavid du Colombier 	fail(pHdrFtrList == NULL && tHdrFtrLen != 0);
300*25b329d5SDavid du Colombier 
301*25b329d5SDavid du Colombier 	if (pHdrFtrList == NULL || tHdrFtrLen == 0) {
302*25b329d5SDavid du Colombier 		/* No information */
303*25b329d5SDavid du Colombier 		return;
304*25b329d5SDavid du Colombier 	}
305*25b329d5SDavid du Colombier 
306*25b329d5SDavid du Colombier 	/* Fill text, text height and useful-ness */
307*25b329d5SDavid du Colombier 	for (tHdrFtr = 0; tHdrFtr < tHdrFtrLen; tHdrFtr++) {
308*25b329d5SDavid du Colombier 		pCurr = pHdrFtrList + tHdrFtr;
309*25b329d5SDavid du Colombier 		for (tIndex = 0;
310*25b329d5SDavid du Colombier 		     tIndex < elementsof(pHdrFtrList->atElement);
311*25b329d5SDavid du Colombier 		     tIndex++) {
312*25b329d5SDavid du Colombier 			pTmp = &pCurr->atElement[tIndex];
313*25b329d5SDavid du Colombier 			pTmp->bUseful =
314*25b329d5SDavid du Colombier 				pTmp->ulCharPosStart != pTmp->ulCharPosNext;
315*25b329d5SDavid du Colombier 			if (pTmp->bUseful) {
316*25b329d5SDavid du Colombier 				pText = pHdrFtrDecryptor(pFile,
317*25b329d5SDavid du Colombier 						pTmp->ulCharPosStart,
318*25b329d5SDavid du Colombier 						pTmp->ulCharPosNext);
319*25b329d5SDavid du Colombier 				pTmp->tInfo.pText = pText;
320*25b329d5SDavid du Colombier 				pTmp->tInfo.lHeight =
321*25b329d5SDavid du Colombier 						lComputeHdrFtrHeight(pText);
322*25b329d5SDavid du Colombier 				pTmp->bTextOriginal = pText != NULL;
323*25b329d5SDavid du Colombier 			} else {
324*25b329d5SDavid du Colombier 				pTmp->tInfo.pText = NULL;
325*25b329d5SDavid du Colombier 				pTmp->tInfo.lHeight = 0;
326*25b329d5SDavid du Colombier 				pTmp->bTextOriginal = FALSE;
327*25b329d5SDavid du Colombier 			}
328*25b329d5SDavid du Colombier 		}
329*25b329d5SDavid du Colombier 	}
330*25b329d5SDavid du Colombier 
331*25b329d5SDavid du Colombier 	/* Replace not-useful records by using inheritance */
332*25b329d5SDavid du Colombier 	if (pHdrFtrList->atElement[HDR_FIRST_PAGE].bUseful) {
333*25b329d5SDavid du Colombier 		pTmp = &pHdrFtrList->atElement[HDR_ODD_PAGES];
334*25b329d5SDavid du Colombier 		if (!pTmp->bUseful) {
335*25b329d5SDavid du Colombier 			*pTmp = pHdrFtrList->atElement[HDR_FIRST_PAGE];
336*25b329d5SDavid du Colombier 			pTmp->bTextOriginal = FALSE;
337*25b329d5SDavid du Colombier 		}
338*25b329d5SDavid du Colombier 		pTmp = &pHdrFtrList->atElement[HDR_EVEN_PAGES];
339*25b329d5SDavid du Colombier 		if (!pTmp->bUseful) {
340*25b329d5SDavid du Colombier 			*pTmp = pHdrFtrList->atElement[HDR_FIRST_PAGE];
341*25b329d5SDavid du Colombier 			pTmp->bTextOriginal = FALSE;
342*25b329d5SDavid du Colombier 		}
343*25b329d5SDavid du Colombier 	}
344*25b329d5SDavid du Colombier 	if (pHdrFtrList->atElement[FTR_FIRST_PAGE].bUseful) {
345*25b329d5SDavid du Colombier 		pTmp = &pHdrFtrList->atElement[FTR_ODD_PAGES];
346*25b329d5SDavid du Colombier 		if (!pTmp->bUseful) {
347*25b329d5SDavid du Colombier 			*pTmp = pHdrFtrList->atElement[FTR_FIRST_PAGE];
348*25b329d5SDavid du Colombier 			pTmp->bTextOriginal = FALSE;
349*25b329d5SDavid du Colombier 		}
350*25b329d5SDavid du Colombier 		pTmp = &pHdrFtrList->atElement[FTR_EVEN_PAGES];
351*25b329d5SDavid du Colombier 		if (!pTmp->bUseful) {
352*25b329d5SDavid du Colombier 			*pTmp = pHdrFtrList->atElement[FTR_FIRST_PAGE];
353*25b329d5SDavid du Colombier 			pTmp->bTextOriginal = FALSE;
354*25b329d5SDavid du Colombier 		}
355*25b329d5SDavid du Colombier 	}
356*25b329d5SDavid du Colombier 	for (tHdrFtr = 1, pCurr = &pHdrFtrList[1];
357*25b329d5SDavid du Colombier 	     tHdrFtr < tHdrFtrLen;
358*25b329d5SDavid du Colombier 	     tHdrFtr++, pCurr++) {
359*25b329d5SDavid du Colombier 		pPrev = pCurr - 1;
360*25b329d5SDavid du Colombier 		for (tIndex = 0;
361*25b329d5SDavid du Colombier 		     tIndex < elementsof(pHdrFtrList->atElement);
362*25b329d5SDavid du Colombier 		     tIndex++) {
363*25b329d5SDavid du Colombier 			if (!pCurr->atElement[tIndex].bUseful &&
364*25b329d5SDavid du Colombier 			    pPrev->atElement[tIndex].bUseful) {
365*25b329d5SDavid du Colombier 				pCurr->atElement[tIndex] =
366*25b329d5SDavid du Colombier 						pPrev->atElement[tIndex];
367*25b329d5SDavid du Colombier 				pCurr->atElement[tIndex].bTextOriginal = FALSE;
368*25b329d5SDavid du Colombier 			}
369*25b329d5SDavid du Colombier 		}
370*25b329d5SDavid du Colombier 	}
371*25b329d5SDavid du Colombier } /* end of vPrepareHdrFtrText */
372