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