1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier * stylesheet.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 a list of stylesheet information
7f5736e95SDavid du Colombier *
8f5736e95SDavid du Colombier */
9f5736e95SDavid du Colombier
10f5736e95SDavid du Colombier #include <string.h>
11f5736e95SDavid du Colombier #include "antiword.h"
12f5736e95SDavid du Colombier
13f5736e95SDavid du Colombier
14f5736e95SDavid du Colombier #define SGC_PAP 1
15f5736e95SDavid du Colombier #define SGC_CHP 2
16f5736e95SDavid du Colombier
17f5736e95SDavid du Colombier /* Variables needed to describe the stylesheet list */
18f5736e95SDavid du Colombier static style_block_type *atStyleInfo = NULL;
19f5736e95SDavid du Colombier static font_block_type *atFontInfo = NULL;
20f5736e95SDavid du Colombier static BOOL *abFilled = NULL;
21f5736e95SDavid du Colombier static size_t tStdCount = 0;
22f5736e95SDavid du Colombier
23f5736e95SDavid du Colombier
24f5736e95SDavid du Colombier /*
25f5736e95SDavid du Colombier * vDestroyStylesheetList - destroy the stylesheet list
26f5736e95SDavid du Colombier */
27f5736e95SDavid du Colombier void
vDestroyStylesheetList(void)28f5736e95SDavid du Colombier vDestroyStylesheetList(void)
29f5736e95SDavid du Colombier {
30f5736e95SDavid du Colombier DBG_MSG("vDestroyStylesheetList");
31f5736e95SDavid du Colombier
32f5736e95SDavid du Colombier tStdCount = 0;
33f5736e95SDavid du Colombier atStyleInfo = xfree(atStyleInfo);
34f5736e95SDavid du Colombier atFontInfo = xfree(atFontInfo);
35f5736e95SDavid du Colombier abFilled = xfree(abFilled);
36f5736e95SDavid du Colombier } /* end of vDestroyStylesheetList */
37f5736e95SDavid du Colombier
38f5736e95SDavid du Colombier /*
39f5736e95SDavid du Colombier * vGetDefaultStyle - fill the style struct with default values
40f5736e95SDavid du Colombier */
41f5736e95SDavid du Colombier static void
vGetDefaultStyle(style_block_type * pStyle)42f5736e95SDavid du Colombier vGetDefaultStyle(style_block_type *pStyle)
43f5736e95SDavid du Colombier {
44f5736e95SDavid du Colombier (void)memset(pStyle, 0, sizeof(*pStyle));
45f5736e95SDavid du Colombier pStyle->usIstd = ISTD_INVALID;
46f5736e95SDavid du Colombier pStyle->usIstdNext = ISTD_INVALID;
47f5736e95SDavid du Colombier pStyle->usStartAt = 1;
48f5736e95SDavid du Colombier pStyle->ucListLevel = 9;
49f5736e95SDavid du Colombier } /* end of vGetDefaultStyle */
50f5736e95SDavid du Colombier
51f5736e95SDavid du Colombier /*
52f5736e95SDavid du Colombier * vGetDefaultFont - fill the font struct with default values
53f5736e95SDavid du Colombier */
54f5736e95SDavid du Colombier static void
vGetDefaultFont(font_block_type * pFont,USHORT usDefaultFontNumber)55*25b329d5SDavid du Colombier vGetDefaultFont(font_block_type *pFont, USHORT usDefaultFontNumber)
56f5736e95SDavid du Colombier {
57f5736e95SDavid du Colombier (void)memset(pFont, 0, sizeof(*pFont));
58f5736e95SDavid du Colombier pFont->usFontSize = DEFAULT_FONT_SIZE;
59*25b329d5SDavid du Colombier if (usDefaultFontNumber <= (USHORT)UCHAR_MAX) {
60*25b329d5SDavid du Colombier pFont->ucFontNumber = (UCHAR)usDefaultFontNumber;
61*25b329d5SDavid du Colombier } else {
62*25b329d5SDavid du Colombier DBG_DEC(usDefaultFontNumber);
63*25b329d5SDavid du Colombier DBG_FIXME();
64*25b329d5SDavid du Colombier pFont->ucFontNumber = 0;
65*25b329d5SDavid du Colombier }
66f5736e95SDavid du Colombier } /* end of vGetDefaultFont */
67f5736e95SDavid du Colombier
68f5736e95SDavid du Colombier /*
69f5736e95SDavid du Colombier * iGetStyleIndex - get the index of the record with the specified istd
70f5736e95SDavid du Colombier *
71f5736e95SDavid du Colombier * returns the index when found, otherwise -1
72f5736e95SDavid du Colombier */
73f5736e95SDavid du Colombier static int
iGetStyleIndex(USHORT usIstd)74f5736e95SDavid du Colombier iGetStyleIndex(USHORT usIstd)
75f5736e95SDavid du Colombier {
76f5736e95SDavid du Colombier int iIndex;
77f5736e95SDavid du Colombier
78f5736e95SDavid du Colombier fail(abFilled == NULL);
79f5736e95SDavid du Colombier
80f5736e95SDavid du Colombier if (usIstd == ISTD_INVALID || abFilled == NULL) {
81f5736e95SDavid du Colombier return -1;
82f5736e95SDavid du Colombier }
83f5736e95SDavid du Colombier
84f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
85f5736e95SDavid du Colombier if (abFilled[iIndex] && atStyleInfo[iIndex].usIstd == usIstd) {
86f5736e95SDavid du Colombier /* The record is filled and the istd matches */
87f5736e95SDavid du Colombier return iIndex;
88f5736e95SDavid du Colombier }
89f5736e95SDavid du Colombier }
90f5736e95SDavid du Colombier return -1;
91f5736e95SDavid du Colombier } /* end of iGetStyleIndex */
92f5736e95SDavid du Colombier
93f5736e95SDavid du Colombier /*
94f5736e95SDavid du Colombier * Get a build-in style for Winword 1/2
95f5736e95SDavid du Colombier */
96f5736e95SDavid du Colombier static void
vGetBuildinStyle(UCHAR ucStc,style_block_type * pStyle)97f5736e95SDavid du Colombier vGetBuildinStyle(UCHAR ucStc, style_block_type *pStyle)
98f5736e95SDavid du Colombier {
99f5736e95SDavid du Colombier fail(pStyle == NULL);
100f5736e95SDavid du Colombier
101f5736e95SDavid du Colombier /* Start with de defaults */
102f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
103f5736e95SDavid du Colombier
104*25b329d5SDavid du Colombier /* Add the build-in style info */
105f5736e95SDavid du Colombier switch (ucStc) {
106f5736e95SDavid du Colombier case 246:
107f5736e95SDavid du Colombier case 247:
108f5736e95SDavid du Colombier case 248:
109f5736e95SDavid du Colombier case 249:
110f5736e95SDavid du Colombier case 250:
111f5736e95SDavid du Colombier case 255:
112f5736e95SDavid du Colombier pStyle->sLeftIndent = 720;
113f5736e95SDavid du Colombier break;
114f5736e95SDavid du Colombier case 251:
115f5736e95SDavid du Colombier case 252:
116f5736e95SDavid du Colombier pStyle->sLeftIndent = 360;
117f5736e95SDavid du Colombier break;
118f5736e95SDavid du Colombier case 253:
119f5736e95SDavid du Colombier pStyle->usBeforeIndent = 120;
120f5736e95SDavid du Colombier break;
121f5736e95SDavid du Colombier case 254:
122f5736e95SDavid du Colombier pStyle->usBeforeIndent = 240;
123f5736e95SDavid du Colombier break;
124f5736e95SDavid du Colombier default:
125f5736e95SDavid du Colombier if (ucStc >= 233 && ucStc <= 239) {
126f5736e95SDavid du Colombier pStyle->sLeftIndent = (239 - (short)ucStc) * 360;
127f5736e95SDavid du Colombier }
128f5736e95SDavid du Colombier if (ucStc >= 225 && ucStc <= 232) {
129f5736e95SDavid du Colombier pStyle->sLeftIndent = (232 - (short)ucStc) * 720;
130f5736e95SDavid du Colombier pStyle->sRightIndent = 720;
131f5736e95SDavid du Colombier }
132f5736e95SDavid du Colombier break;
133f5736e95SDavid du Colombier }
134f5736e95SDavid du Colombier } /* end of vGetBuildinStyle */
135f5736e95SDavid du Colombier
136f5736e95SDavid du Colombier /*
137f5736e95SDavid du Colombier * Get a build-in fontstyle for Winword 1/2
138f5736e95SDavid du Colombier */
139f5736e95SDavid du Colombier static void
vGetBuildinFont(UCHAR ucStc,font_block_type * pFont)140f5736e95SDavid du Colombier vGetBuildinFont(UCHAR ucStc, font_block_type *pFont)
141f5736e95SDavid du Colombier {
142f5736e95SDavid du Colombier fail(pFont == NULL);
143f5736e95SDavid du Colombier
144f5736e95SDavid du Colombier /* Start with de defaults */
145*25b329d5SDavid du Colombier vGetDefaultFont(pFont, 0);
146f5736e95SDavid du Colombier
147*25b329d5SDavid du Colombier /* Add the build-in fontstyle info */
148f5736e95SDavid du Colombier switch (ucStc) {
149f5736e95SDavid du Colombier case 223:
150f5736e95SDavid du Colombier case 244:
151f5736e95SDavid du Colombier pFont->usFontSize = 16;
152f5736e95SDavid du Colombier break;
153f5736e95SDavid du Colombier case 246:
154f5736e95SDavid du Colombier case 247:
155f5736e95SDavid du Colombier case 248:
156f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_ITALIC;
157f5736e95SDavid du Colombier break;
158f5736e95SDavid du Colombier case 249:
159f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_UNDERLINE;
160f5736e95SDavid du Colombier break;
161f5736e95SDavid du Colombier case 250:
162f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_BOLD;
163f5736e95SDavid du Colombier break;
164f5736e95SDavid du Colombier case 251:
165f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_UNDERLINE;
166f5736e95SDavid du Colombier pFont->usFontSize = 24;
167f5736e95SDavid du Colombier break;
168f5736e95SDavid du Colombier case 252:
169f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_BOLD;
170f5736e95SDavid du Colombier pFont->usFontSize = 24;
171f5736e95SDavid du Colombier break;
172f5736e95SDavid du Colombier case 253:
173f5736e95SDavid du Colombier pFont->ucFontNumber = 2;
174f5736e95SDavid du Colombier pFont->usFontStyle |= FONT_BOLD;
175f5736e95SDavid du Colombier pFont->usFontSize = 24;
176f5736e95SDavid du Colombier break;
177f5736e95SDavid du Colombier case 254:
178f5736e95SDavid du Colombier pFont->ucFontNumber = 2;
179f5736e95SDavid du Colombier pFont->usFontStyle |= (FONT_BOLD|FONT_UNDERLINE);
180f5736e95SDavid du Colombier pFont->usFontSize = 24;
181f5736e95SDavid du Colombier break;
182f5736e95SDavid du Colombier default:
183f5736e95SDavid du Colombier break;
184f5736e95SDavid du Colombier }
185f5736e95SDavid du Colombier } /* end of vGetBuildinFont */
186f5736e95SDavid du Colombier
187f5736e95SDavid du Colombier /*
188*25b329d5SDavid du Colombier * Convert a stylecode (stc) as used by WinWord 1/2 into a styleindex (istd)
189*25b329d5SDavid du Colombier * as used by Word 6 and up
190*25b329d5SDavid du Colombier */
191*25b329d5SDavid du Colombier USHORT
usStc2istd(UCHAR ucStc)192*25b329d5SDavid du Colombier usStc2istd(UCHAR ucStc)
193*25b329d5SDavid du Colombier {
194*25b329d5SDavid du Colombier /* Old nil style to new nil style */
195*25b329d5SDavid du Colombier if (ucStc == 222) {
196*25b329d5SDavid du Colombier return STI_NIL;
197*25b329d5SDavid du Colombier }
198*25b329d5SDavid du Colombier
199*25b329d5SDavid du Colombier /* Heading 1 through 9 must become istd 1 through 9 */
200*25b329d5SDavid du Colombier /* so 254 through 246 must become 1 through 9 and vice versa */
201*25b329d5SDavid du Colombier if ((ucStc >= 1 && ucStc <= 9) ||
202*25b329d5SDavid du Colombier (ucStc >= 246 && ucStc <= 254)) {
203*25b329d5SDavid du Colombier return 255 - (USHORT)ucStc;
204*25b329d5SDavid du Colombier }
205*25b329d5SDavid du Colombier return (USHORT)ucStc;
206*25b329d5SDavid du Colombier } /* end of usStd2istd */
207*25b329d5SDavid du Colombier
208*25b329d5SDavid du Colombier /*
209f5736e95SDavid du Colombier * Build the lists with Stylesheet Information for WinWord 1/2 files
210f5736e95SDavid du Colombier */
211f5736e95SDavid du Colombier void
vGet2Stylesheet(FILE * pFile,int iWordVersion,const UCHAR * aucHeader)212f5736e95SDavid du Colombier vGet2Stylesheet(FILE *pFile, int iWordVersion, const UCHAR *aucHeader)
213f5736e95SDavid du Colombier {
214f5736e95SDavid du Colombier style_block_type *pStyle;
215f5736e95SDavid du Colombier font_block_type *pFont;
216f5736e95SDavid du Colombier UCHAR *aucBuffer;
217f5736e95SDavid du Colombier ULONG ulBeginStshInfo;
218*25b329d5SDavid du Colombier size_t tStshInfoLen, tName, tChpx, tPapx, tMaxIndex;
219*25b329d5SDavid du Colombier int iStIndex, iChpxIndex, iPapxIndex, iSt, iChpx, iPapx;
220f5736e95SDavid du Colombier int iStd, iIndex, iBaseStyleIndex, iCounter;
221f5736e95SDavid du Colombier USHORT usBaseStyle;
222f5736e95SDavid du Colombier UCHAR ucStc, ucStcNext, ucStcBase;
223f5736e95SDavid du Colombier
224f5736e95SDavid du Colombier fail(pFile == NULL || aucHeader == NULL);
225f5736e95SDavid du Colombier fail(iWordVersion != 1 && iWordVersion != 2);
226f5736e95SDavid du Colombier
227f5736e95SDavid du Colombier ulBeginStshInfo = ulGetLong(0x5e, aucHeader); /* fcStshf */
228f5736e95SDavid du Colombier NO_DBG_HEX(ulBeginStshInfo);
229f5736e95SDavid du Colombier tStshInfoLen = (size_t)usGetWord(0x62, aucHeader); /* cbStshf */
230f5736e95SDavid du Colombier NO_DBG_DEC(tStshInfoLen);
231f5736e95SDavid du Colombier
232f5736e95SDavid du Colombier aucBuffer = xmalloc(tStshInfoLen);
233f5736e95SDavid du Colombier if (!bReadBytes(aucBuffer, tStshInfoLen, ulBeginStshInfo, pFile)) {
234f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
235f5736e95SDavid du Colombier return;
236f5736e95SDavid du Colombier }
237f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen);
238f5736e95SDavid du Colombier
239*25b329d5SDavid du Colombier fail(2 > tStshInfoLen);
240f5736e95SDavid du Colombier iStd = (int)usGetWord(0, aucBuffer);
241*25b329d5SDavid du Colombier
242*25b329d5SDavid du Colombier fail(2 + 2 > tStshInfoLen);
243f5736e95SDavid du Colombier tName = (size_t)usGetWord(2, aucBuffer);
244*25b329d5SDavid du Colombier
245*25b329d5SDavid du Colombier fail(2 + tName + 2 > tStshInfoLen);
246f5736e95SDavid du Colombier tChpx = (size_t)usGetWord(2 + tName, aucBuffer);
247*25b329d5SDavid du Colombier
248*25b329d5SDavid du Colombier fail(2 + tName + tChpx + 2 > tStshInfoLen);
249f5736e95SDavid du Colombier tPapx = (size_t)usGetWord(2 + tName + tChpx, aucBuffer);
250*25b329d5SDavid du Colombier
251*25b329d5SDavid du Colombier fail(2 + tName + tChpx + tPapx + 2 > tStshInfoLen);
252f5736e95SDavid du Colombier tStdCount = (size_t)usGetWord(2 + tName + tChpx + tPapx, aucBuffer);
253f5736e95SDavid du Colombier
254f5736e95SDavid du Colombier NO_DBG_HEX(tStdCount);
255f5736e95SDavid du Colombier
256f5736e95SDavid du Colombier atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type));
257f5736e95SDavid du Colombier atFontInfo = xcalloc(tStdCount, sizeof(font_block_type));
258f5736e95SDavid du Colombier abFilled = xcalloc(tStdCount, sizeof(BOOL));
259f5736e95SDavid du Colombier
260f5736e95SDavid du Colombier do {
261f5736e95SDavid du Colombier iCounter = 0;
262f5736e95SDavid du Colombier iStIndex = 2 + 2;
263f5736e95SDavid du Colombier iChpxIndex = 2 + (int)tName + 2;
264f5736e95SDavid du Colombier iPapxIndex = 2 + (int)tName + (int)tChpx + 2;
265*25b329d5SDavid du Colombier tMaxIndex = 2 + tName + tChpx + tPapx + 2;
266f5736e95SDavid du Colombier /* Read the styles one-by-one */
267f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
268f5736e95SDavid du Colombier pStyle = &atStyleInfo[iIndex];
269f5736e95SDavid du Colombier pFont = &atFontInfo[iIndex];
270f5736e95SDavid du Colombier iSt = (int)ucGetByte(iStIndex, aucBuffer);
271f5736e95SDavid du Colombier iChpx = (int)ucGetByte(iChpxIndex, aucBuffer);
272f5736e95SDavid du Colombier iPapx = (int)ucGetByte(iPapxIndex, aucBuffer);
273f5736e95SDavid du Colombier NO_DBG_HEX(iSt);
274f5736e95SDavid du Colombier NO_DBG_HEX(iChpx);
275f5736e95SDavid du Colombier NO_DBG_HEX(iPapx);
276*25b329d5SDavid du Colombier if (iSt == 0xff || tMaxIndex + 1 >= tStshInfoLen) {
277*25b329d5SDavid du Colombier /* Undefined style or no information */
278f5736e95SDavid du Colombier iStIndex++;
279f5736e95SDavid du Colombier iChpxIndex++;
280f5736e95SDavid du Colombier iPapxIndex++;
281*25b329d5SDavid du Colombier tMaxIndex += 2;
282f5736e95SDavid du Colombier if (!abFilled[iIndex]) {
283f5736e95SDavid du Colombier DBG_HEX_C(iChpx != 0xff, iChpx);
284f5736e95SDavid du Colombier DBG_HEX_C(iPapx != 0xff, iPapx);
285f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
286*25b329d5SDavid du Colombier vGetDefaultFont(pFont, 0);
287f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
288f5736e95SDavid du Colombier }
289f5736e95SDavid du Colombier continue;
290f5736e95SDavid du Colombier }
291f5736e95SDavid du Colombier
292f5736e95SDavid du Colombier NO_DBG_STRN(aucBuffer + iStIndex + 1, iSt);
293f5736e95SDavid du Colombier iStIndex += iSt + 1;
294f5736e95SDavid du Colombier
295*25b329d5SDavid du Colombier ucStcNext = ucGetByte(tMaxIndex, aucBuffer);
296*25b329d5SDavid du Colombier ucStcBase = ucGetByte(tMaxIndex + 1, aucBuffer);
297f5736e95SDavid du Colombier ucStc = (UCHAR)((iIndex - iStd) & 0xff);
298f5736e95SDavid du Colombier NO_DBG_DEC(ucStc);
299f5736e95SDavid du Colombier
300f5736e95SDavid du Colombier if (iChpx == 0xff || iPapx == 0xff) {
301f5736e95SDavid du Colombier /* Use a build-in style */
302f5736e95SDavid du Colombier iChpxIndex++;
303f5736e95SDavid du Colombier iPapxIndex++;
304*25b329d5SDavid du Colombier tMaxIndex += 2;
305f5736e95SDavid du Colombier if (!abFilled[iIndex]) {
306f5736e95SDavid du Colombier DBG_HEX_C(iChpx != 0xff, iChpx);
307f5736e95SDavid du Colombier DBG_HEX_C(iPapx != 0xff, iPapx);
308f5736e95SDavid du Colombier vGetBuildinStyle(ucStc, pStyle);
309f5736e95SDavid du Colombier pStyle->usIstd = usStc2istd(ucStc);
310f5736e95SDavid du Colombier pStyle->usIstdNext =
311f5736e95SDavid du Colombier usStc2istd(ucStcNext);
312f5736e95SDavid du Colombier vGetBuildinFont(ucStc, pFont);
313f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
314f5736e95SDavid du Colombier }
315f5736e95SDavid du Colombier continue;
316f5736e95SDavid du Colombier }
317f5736e95SDavid du Colombier
318f5736e95SDavid du Colombier if (abFilled[iIndex]) {
319f5736e95SDavid du Colombier /* This record has already been filled */
320f5736e95SDavid du Colombier iChpxIndex += iChpx + 1;
321f5736e95SDavid du Colombier iPapxIndex += iPapx + 1;
322*25b329d5SDavid du Colombier tMaxIndex += 2;
323f5736e95SDavid du Colombier continue;
324f5736e95SDavid du Colombier }
325f5736e95SDavid du Colombier
326f5736e95SDavid du Colombier usBaseStyle = usStc2istd(ucStcBase);
327f5736e95SDavid du Colombier
328f5736e95SDavid du Colombier if (usBaseStyle == STI_NIL) {
329f5736e95SDavid du Colombier /* Based on the Nil style */
330f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
331*25b329d5SDavid du Colombier vGetDefaultFont(pFont, 0);
332f5736e95SDavid du Colombier } else {
333f5736e95SDavid du Colombier iBaseStyleIndex = iGetStyleIndex(usBaseStyle);
334f5736e95SDavid du Colombier NO_DBG_DEC(iBaseStyleIndex);
335f5736e95SDavid du Colombier if (iBaseStyleIndex < 0) {
336f5736e95SDavid du Colombier /* This style is not known yet */
337f5736e95SDavid du Colombier iChpxIndex += iChpx + 1;
338f5736e95SDavid du Colombier iPapxIndex += iPapx + 1;
339*25b329d5SDavid du Colombier tMaxIndex += 2;
340f5736e95SDavid du Colombier continue;
341f5736e95SDavid du Colombier }
342f5736e95SDavid du Colombier fail(iBaseStyleIndex >= (int)tStdCount);
343f5736e95SDavid du Colombier fail(!abFilled[iBaseStyleIndex]);
344f5736e95SDavid du Colombier /* Based on the specified base style */
345f5736e95SDavid du Colombier *pStyle = atStyleInfo[iBaseStyleIndex];
346f5736e95SDavid du Colombier *pFont = atFontInfo[iBaseStyleIndex];
347f5736e95SDavid du Colombier }
348f5736e95SDavid du Colombier pStyle->usIstd = usStc2istd(ucStc);
349f5736e95SDavid du Colombier pStyle->usIstdNext = usStc2istd(ucStcNext);
350f5736e95SDavid du Colombier
351f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
352f5736e95SDavid du Colombier iCounter++;
353f5736e95SDavid du Colombier
354f5736e95SDavid du Colombier /* Add the changes if any */
355f5736e95SDavid du Colombier switch (iChpx) {
356f5736e95SDavid du Colombier case 0x00:
357f5736e95SDavid du Colombier case 0xff:
358f5736e95SDavid du Colombier iChpxIndex++;
359f5736e95SDavid du Colombier break;
360f5736e95SDavid du Colombier default:
361f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(aucBuffer + iChpxIndex + 1,
362f5736e95SDavid du Colombier iChpx);
363f5736e95SDavid du Colombier if (iWordVersion == 1) {
364f5736e95SDavid du Colombier vGet1FontInfo(0,
365f5736e95SDavid du Colombier aucBuffer + iChpxIndex + 1,
366f5736e95SDavid du Colombier (size_t)iChpx, pFont);
367f5736e95SDavid du Colombier } else {
368f5736e95SDavid du Colombier vGet2FontInfo(0,
369f5736e95SDavid du Colombier aucBuffer + iChpxIndex + 1,
370f5736e95SDavid du Colombier (size_t)iChpx, pFont);
371f5736e95SDavid du Colombier }
372f5736e95SDavid du Colombier iChpxIndex += iChpx + 1;
373f5736e95SDavid du Colombier break;
374f5736e95SDavid du Colombier }
375f5736e95SDavid du Colombier
376f5736e95SDavid du Colombier switch (iPapx) {
377f5736e95SDavid du Colombier case 0x00:
378f5736e95SDavid du Colombier case 0xff:
379f5736e95SDavid du Colombier iPapxIndex++;
380f5736e95SDavid du Colombier break;
381f5736e95SDavid du Colombier default:
382f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(aucBuffer + iPapxIndex + 8,
383f5736e95SDavid du Colombier iPapx - 7);
384f5736e95SDavid du Colombier vGet2StyleInfo(0, aucBuffer + iPapxIndex + 8,
385f5736e95SDavid du Colombier iPapx - 7, pStyle);
386f5736e95SDavid du Colombier iPapxIndex += iPapx + 1;
387f5736e95SDavid du Colombier break;
388f5736e95SDavid du Colombier }
389*25b329d5SDavid du Colombier tMaxIndex += 2;
390f5736e95SDavid du Colombier
391f5736e95SDavid du Colombier }
392f5736e95SDavid du Colombier NO_DBG_DEC(iCounter);
393f5736e95SDavid du Colombier } while (iCounter > 0);
394f5736e95SDavid du Colombier
395*25b329d5SDavid du Colombier /* Fill records that are still empty */
396f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
397f5736e95SDavid du Colombier if (!abFilled[iIndex]) {
398f5736e95SDavid du Colombier NO_DBG_DEC(iIndex);
399f5736e95SDavid du Colombier vGetDefaultStyle(&atStyleInfo[iIndex]);
400*25b329d5SDavid du Colombier vGetDefaultFont(&atFontInfo[iIndex], 0);
401f5736e95SDavid du Colombier }
402f5736e95SDavid du Colombier }
403f5736e95SDavid du Colombier
404*25b329d5SDavid du Colombier /* Clean up before you leave */
405f5736e95SDavid du Colombier abFilled = xfree(abFilled);
406f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
407f5736e95SDavid du Colombier } /* end of vGet2Stylesheet */
408f5736e95SDavid du Colombier
409f5736e95SDavid du Colombier /*
410f5736e95SDavid du Colombier * Build the lists with Stylesheet Information for Word 6/7 files
411f5736e95SDavid du Colombier */
412f5736e95SDavid du Colombier void
vGet6Stylesheet(FILE * pFile,ULONG ulStartBlock,const ULONG * aulBBD,size_t tBBDLen,const UCHAR * aucHeader)413f5736e95SDavid du Colombier vGet6Stylesheet(FILE *pFile, ULONG ulStartBlock,
414f5736e95SDavid du Colombier const ULONG *aulBBD, size_t tBBDLen, const UCHAR *aucHeader)
415f5736e95SDavid du Colombier {
416f5736e95SDavid du Colombier style_block_type *pStyle;
417f5736e95SDavid du Colombier font_block_type *pFont;
418f5736e95SDavid du Colombier UCHAR *aucBuffer;
419f5736e95SDavid du Colombier ULONG ulBeginStshInfo;
420f5736e95SDavid du Colombier size_t tStshInfoLen, tOffset, tStdLen, tStdBaseInFile;
421f5736e95SDavid du Colombier size_t tPos, tNameLen, tUpxLen;
422f5736e95SDavid du Colombier int iIndex, iBaseStyleIndex, iCounter;
423f5736e95SDavid du Colombier USHORT usTmp, usUpxCount, usStyleType, usBaseStyle;
424*25b329d5SDavid du Colombier USHORT usFtcStandardChpStsh;
425f5736e95SDavid du Colombier
426f5736e95SDavid du Colombier fail(pFile == NULL || aucHeader == NULL);
427f5736e95SDavid du Colombier fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
428f5736e95SDavid du Colombier fail(aulBBD == NULL);
429f5736e95SDavid du Colombier
430f5736e95SDavid du Colombier ulBeginStshInfo = ulGetLong(0x60, aucHeader); /* fcStshf */
431f5736e95SDavid du Colombier NO_DBG_HEX(ulBeginStshInfo);
432f5736e95SDavid du Colombier tStshInfoLen = (size_t)ulGetLong(0x64, aucHeader); /* lcbStshf */
433f5736e95SDavid du Colombier NO_DBG_DEC(tStshInfoLen);
434f5736e95SDavid du Colombier
435f5736e95SDavid du Colombier aucBuffer = xmalloc(tStshInfoLen);
436f5736e95SDavid du Colombier if (!bReadBuffer(pFile, ulStartBlock,
437f5736e95SDavid du Colombier aulBBD, tBBDLen, BIG_BLOCK_SIZE,
438f5736e95SDavid du Colombier aucBuffer, ulBeginStshInfo, tStshInfoLen)) {
439f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
440f5736e95SDavid du Colombier return;
441f5736e95SDavid du Colombier }
442f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen);
443f5736e95SDavid du Colombier
444f5736e95SDavid du Colombier tStdCount = (size_t)usGetWord(2, aucBuffer);
445f5736e95SDavid du Colombier NO_DBG_DEC(tStdCount);
446f5736e95SDavid du Colombier tStdBaseInFile = (size_t)usGetWord(4, aucBuffer);
447*25b329d5SDavid du Colombier usFtcStandardChpStsh = usGetWord(14, aucBuffer);
448*25b329d5SDavid du Colombier NO_DBG_DEC(usFtcStandardChpStsh);
449f5736e95SDavid du Colombier
450f5736e95SDavid du Colombier atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type));
451f5736e95SDavid du Colombier atFontInfo = xcalloc(tStdCount, sizeof(font_block_type));
452f5736e95SDavid du Colombier abFilled = xcalloc(tStdCount, sizeof(BOOL));
453f5736e95SDavid du Colombier
454f5736e95SDavid du Colombier do {
455f5736e95SDavid du Colombier iCounter = 0;
456f5736e95SDavid du Colombier /* Read the styles one-by-one */
457f5736e95SDavid du Colombier for (iIndex = 0, tOffset = 2 + (size_t)usGetWord(0, aucBuffer);
458f5736e95SDavid du Colombier iIndex < (int)tStdCount;
459f5736e95SDavid du Colombier iIndex++, tOffset += 2 + tStdLen) {
460f5736e95SDavid du Colombier NO_DBG_DEC(tOffset);
461f5736e95SDavid du Colombier tStdLen = (size_t)usGetWord(tOffset, aucBuffer);
462f5736e95SDavid du Colombier NO_DBG_DEC(tStdLen);
463f5736e95SDavid du Colombier if (abFilled[iIndex]) {
464f5736e95SDavid du Colombier /* This record has already been filled */
465f5736e95SDavid du Colombier continue;
466f5736e95SDavid du Colombier }
467f5736e95SDavid du Colombier pStyle = &atStyleInfo[iIndex];
468f5736e95SDavid du Colombier pFont = &atFontInfo[iIndex];
469f5736e95SDavid du Colombier if (tStdLen == 0) {
470f5736e95SDavid du Colombier /* Empty record */
471f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
472*25b329d5SDavid du Colombier vGetDefaultFont(pFont, usFtcStandardChpStsh);
473f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
474f5736e95SDavid du Colombier continue;
475f5736e95SDavid du Colombier }
476f5736e95SDavid du Colombier usTmp = usGetWord(tOffset + 4, aucBuffer);
477f5736e95SDavid du Colombier usStyleType = usTmp % 16;
478f5736e95SDavid du Colombier usBaseStyle = usTmp / 16;
479f5736e95SDavid du Colombier NO_DBG_DEC(usStyleType);
480f5736e95SDavid du Colombier NO_DBG_DEC(usBaseStyle);
481f5736e95SDavid du Colombier if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) {
482f5736e95SDavid du Colombier /* Based on the Nil style */
483f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
484*25b329d5SDavid du Colombier vGetDefaultFont(pFont, usFtcStandardChpStsh);
485f5736e95SDavid du Colombier } else {
486f5736e95SDavid du Colombier iBaseStyleIndex = iGetStyleIndex(usBaseStyle);
487f5736e95SDavid du Colombier NO_DBG_DEC(iBaseStyleIndex);
488f5736e95SDavid du Colombier if (iBaseStyleIndex < 0) {
489f5736e95SDavid du Colombier /* This base style is not known yet */
490f5736e95SDavid du Colombier continue;
491f5736e95SDavid du Colombier }
492f5736e95SDavid du Colombier fail(iBaseStyleIndex >= (int)tStdCount);
493f5736e95SDavid du Colombier fail(!abFilled[iBaseStyleIndex]);
494f5736e95SDavid du Colombier /* Based on the specified base style */
495f5736e95SDavid du Colombier *pStyle = atStyleInfo[iBaseStyleIndex];
496f5736e95SDavid du Colombier pStyle->usIstd = ISTD_INVALID;
497f5736e95SDavid du Colombier *pFont = atFontInfo[iBaseStyleIndex];
498f5736e95SDavid du Colombier }
499f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
500f5736e95SDavid du Colombier iCounter++;
501f5736e95SDavid du Colombier /* STD */
502f5736e95SDavid du Colombier usTmp = usGetWord(tOffset + 6, aucBuffer);
503f5736e95SDavid du Colombier usUpxCount = usTmp % 16;
504f5736e95SDavid du Colombier pStyle->usIstdNext = usTmp / 16;;
505f5736e95SDavid du Colombier NO_DBG_DEC(usUpxCount);
506f5736e95SDavid du Colombier tPos = 2 + tStdBaseInFile;
507f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
508f5736e95SDavid du Colombier tNameLen = (size_t)ucGetByte(tOffset + tPos, aucBuffer);
509f5736e95SDavid du Colombier NO_DBG_DEC(tNameLen);
510f5736e95SDavid du Colombier NO_DBG_STRN(aucBuffer + tOffset + tPos + 1, tNameLen);
511f5736e95SDavid du Colombier tNameLen++; /* Include the ASCII NULL character */
512f5736e95SDavid du Colombier tPos += 1 + tNameLen;
513f5736e95SDavid du Colombier if (odd(tPos)) {
514f5736e95SDavid du Colombier tPos++;
515f5736e95SDavid du Colombier }
516f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
517f5736e95SDavid du Colombier if (tPos >= tStdLen) {
518f5736e95SDavid du Colombier continue;
519f5736e95SDavid du Colombier }
520f5736e95SDavid du Colombier tUpxLen = (size_t)usGetWord(tOffset + tPos, aucBuffer);
521f5736e95SDavid du Colombier NO_DBG_DEC(tUpxLen);
522f5736e95SDavid du Colombier if (tPos + tUpxLen > tStdLen) {
523f5736e95SDavid du Colombier /* UPX length too large to be a record */
524f5736e95SDavid du Colombier DBG_DEC_C(tPos + tUpxLen > tStdLen,
525f5736e95SDavid du Colombier tPos + tUpxLen);
526f5736e95SDavid du Colombier continue;
527f5736e95SDavid du Colombier }
528f5736e95SDavid du Colombier if (usStyleType == SGC_PAP && usUpxCount >= 1) {
529f5736e95SDavid du Colombier if (tUpxLen >= 2) {
530f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(
531f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
532f5736e95SDavid du Colombier tUpxLen);
533f5736e95SDavid du Colombier pStyle->usIstd = usGetWord(
534f5736e95SDavid du Colombier tOffset + tPos + 2, aucBuffer);
535f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->usIstd);
536f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->usIstdNext);
537f5736e95SDavid du Colombier vGet6StyleInfo(0,
538f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 4,
539f5736e95SDavid du Colombier tUpxLen - 2, pStyle);
540f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->sLeftIndent);
541f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->sRightIndent);
542f5736e95SDavid du Colombier NO_DBG_HEX(pStyle->ucAlignment);
543f5736e95SDavid du Colombier }
544f5736e95SDavid du Colombier tPos += 2 + tUpxLen;
545f5736e95SDavid du Colombier if (odd(tPos)) {
546f5736e95SDavid du Colombier tPos++;
547f5736e95SDavid du Colombier }
548f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
549f5736e95SDavid du Colombier tUpxLen = (size_t)usGetWord(
550f5736e95SDavid du Colombier tOffset + tPos, aucBuffer);
551f5736e95SDavid du Colombier NO_DBG_DEC(tUpxLen);
552f5736e95SDavid du Colombier }
553f5736e95SDavid du Colombier if (tUpxLen == 0 || tPos + tUpxLen > tStdLen) {
554f5736e95SDavid du Colombier /* Too small or too large to be a record */
555f5736e95SDavid du Colombier DBG_DEC_C(tPos + tUpxLen > tStdLen,
556f5736e95SDavid du Colombier tPos + tUpxLen);
557f5736e95SDavid du Colombier continue;
558f5736e95SDavid du Colombier }
559f5736e95SDavid du Colombier if ((usStyleType == SGC_PAP && usUpxCount >= 2) ||
560f5736e95SDavid du Colombier (usStyleType == SGC_CHP && usUpxCount >= 1)) {
561f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(
562f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
563f5736e95SDavid du Colombier tUpxLen);
564f5736e95SDavid du Colombier vGet6FontInfo(0, ISTD_INVALID,
565f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
566f5736e95SDavid du Colombier (int)tUpxLen, pFont);
567f5736e95SDavid du Colombier NO_DBG_DEC(pFont->usFontSize);
568f5736e95SDavid du Colombier NO_DBG_DEC(pFont->ucFontcolor);
569f5736e95SDavid du Colombier NO_DBG_HEX(pFont->usFontStyle);
570f5736e95SDavid du Colombier }
571f5736e95SDavid du Colombier }
572f5736e95SDavid du Colombier NO_DBG_DEC(iCounter);
573f5736e95SDavid du Colombier } while (iCounter > 0);
574f5736e95SDavid du Colombier
575*25b329d5SDavid du Colombier /* Fill records that are still empty */
576f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
577f5736e95SDavid du Colombier if (!abFilled[iIndex]) {
578f5736e95SDavid du Colombier NO_DBG_DEC(iIndex);
579f5736e95SDavid du Colombier vGetDefaultStyle(&atStyleInfo[iIndex]);
580*25b329d5SDavid du Colombier vGetDefaultFont(&atFontInfo[iIndex],
581*25b329d5SDavid du Colombier usFtcStandardChpStsh);
582f5736e95SDavid du Colombier }
583f5736e95SDavid du Colombier }
584f5736e95SDavid du Colombier
585*25b329d5SDavid du Colombier /* Clean up before you leave */
586f5736e95SDavid du Colombier abFilled = xfree(abFilled);
587f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
588f5736e95SDavid du Colombier } /* end of vGet6Stylesheet */
589f5736e95SDavid du Colombier
590f5736e95SDavid du Colombier /*
591f5736e95SDavid du Colombier * Build the lists with Stylesheet Information for Word 8/9/10 files
592f5736e95SDavid du Colombier */
593f5736e95SDavid du Colombier void
vGet8Stylesheet(FILE * pFile,const pps_info_type * pPPS,const ULONG * aulBBD,size_t tBBDLen,const ULONG * aulSBD,size_t tSBDLen,const UCHAR * aucHeader)594f5736e95SDavid du Colombier vGet8Stylesheet(FILE *pFile, const pps_info_type *pPPS,
595f5736e95SDavid du Colombier const ULONG *aulBBD, size_t tBBDLen,
596f5736e95SDavid du Colombier const ULONG *aulSBD, size_t tSBDLen,
597f5736e95SDavid du Colombier const UCHAR *aucHeader)
598f5736e95SDavid du Colombier {
599f5736e95SDavid du Colombier style_block_type *pStyle;
600f5736e95SDavid du Colombier font_block_type *pFont;
601f5736e95SDavid du Colombier const ULONG *aulBlockDepot;
602f5736e95SDavid du Colombier UCHAR *aucBuffer;
603f5736e95SDavid du Colombier ULONG ulBeginStshInfo;
604f5736e95SDavid du Colombier size_t tStshInfoLen, tBlockDepotLen, tOffset, tStdLen, tStdBaseInFile;
605f5736e95SDavid du Colombier size_t tBlockSize, tPos, tNameLen, tUpxLen;
606f5736e95SDavid du Colombier int iIndex, iBaseStyleIndex, iCounter;
607*25b329d5SDavid du Colombier USHORT usTmp, usUpxCount, usStyleType, usBaseStyle;
608*25b329d5SDavid du Colombier USHORT usFtcStandardChpStsh;
609f5736e95SDavid du Colombier
610f5736e95SDavid du Colombier fail(pFile == NULL || pPPS == NULL || aucHeader == NULL);
611f5736e95SDavid du Colombier fail(aulBBD == NULL || aulSBD == NULL);
612f5736e95SDavid du Colombier
613f5736e95SDavid du Colombier ulBeginStshInfo = ulGetLong(0xa2, aucHeader); /* fcStshf */
614f5736e95SDavid du Colombier NO_DBG_HEX(ulBeginStshInfo);
615f5736e95SDavid du Colombier tStshInfoLen = (size_t)ulGetLong(0xa6, aucHeader); /* lcbStshf */
616f5736e95SDavid du Colombier NO_DBG_DEC(tStshInfoLen);
617f5736e95SDavid du Colombier
618*25b329d5SDavid du Colombier NO_DBG_DEC(pPPS->tTable.ulSB);
619*25b329d5SDavid du Colombier NO_DBG_HEX(pPPS->tTable.ulSize);
620*25b329d5SDavid du Colombier if (pPPS->tTable.ulSize == 0) {
621f5736e95SDavid du Colombier DBG_MSG("No stylesheet information");
622f5736e95SDavid du Colombier return;
623f5736e95SDavid du Colombier }
624*25b329d5SDavid du Colombier
625*25b329d5SDavid du Colombier if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
626f5736e95SDavid du Colombier /* Use the Small Block Depot */
627f5736e95SDavid du Colombier aulBlockDepot = aulSBD;
628f5736e95SDavid du Colombier tBlockDepotLen = tSBDLen;
629f5736e95SDavid du Colombier tBlockSize = SMALL_BLOCK_SIZE;
630f5736e95SDavid du Colombier } else {
631f5736e95SDavid du Colombier /* Use the Big Block Depot */
632f5736e95SDavid du Colombier aulBlockDepot = aulBBD;
633f5736e95SDavid du Colombier tBlockDepotLen = tBBDLen;
634f5736e95SDavid du Colombier tBlockSize = BIG_BLOCK_SIZE;
635f5736e95SDavid du Colombier }
636f5736e95SDavid du Colombier aucBuffer = xmalloc(tStshInfoLen);
637*25b329d5SDavid du Colombier if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
638f5736e95SDavid du Colombier aulBlockDepot, tBlockDepotLen, tBlockSize,
639f5736e95SDavid du Colombier aucBuffer, ulBeginStshInfo, tStshInfoLen)) {
640f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
641f5736e95SDavid du Colombier return;
642f5736e95SDavid du Colombier }
643f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(aucBuffer, tStshInfoLen);
644f5736e95SDavid du Colombier
645f5736e95SDavid du Colombier tStdCount = (size_t)usGetWord(2, aucBuffer);
646f5736e95SDavid du Colombier NO_DBG_DEC(tStdCount);
647f5736e95SDavid du Colombier tStdBaseInFile = (size_t)usGetWord(4, aucBuffer);
648*25b329d5SDavid du Colombier usFtcStandardChpStsh = usGetWord(14, aucBuffer);
649*25b329d5SDavid du Colombier NO_DBG_DEC(usFtcStandardChpStsh);
650f5736e95SDavid du Colombier
651f5736e95SDavid du Colombier atStyleInfo = xcalloc(tStdCount, sizeof(style_block_type));
652f5736e95SDavid du Colombier atFontInfo = xcalloc(tStdCount, sizeof(font_block_type));
653f5736e95SDavid du Colombier abFilled = xcalloc(tStdCount, sizeof(BOOL));
654f5736e95SDavid du Colombier
655f5736e95SDavid du Colombier do {
656f5736e95SDavid du Colombier iCounter = 0;
657f5736e95SDavid du Colombier /* Read the styles one-by-one */
658f5736e95SDavid du Colombier for (iIndex = 0, tOffset = 2 + (size_t)usGetWord(0, aucBuffer);
659f5736e95SDavid du Colombier iIndex < (int)tStdCount;
660f5736e95SDavid du Colombier iIndex++, tOffset += 2 + tStdLen) {
661f5736e95SDavid du Colombier NO_DBG_DEC(tOffset);
662f5736e95SDavid du Colombier tStdLen = (size_t)usGetWord(tOffset, aucBuffer);
663f5736e95SDavid du Colombier NO_DBG_DEC(tStdLen);
664f5736e95SDavid du Colombier if (abFilled[iIndex]) {
665f5736e95SDavid du Colombier /* This record has already been filled */
666f5736e95SDavid du Colombier continue;
667f5736e95SDavid du Colombier }
668f5736e95SDavid du Colombier pStyle = &atStyleInfo[iIndex];
669f5736e95SDavid du Colombier pFont = &atFontInfo[iIndex];
670f5736e95SDavid du Colombier if (tStdLen == 0) {
671f5736e95SDavid du Colombier /* Empty record */
672f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
673*25b329d5SDavid du Colombier vGetDefaultFont(pFont, usFtcStandardChpStsh);
674f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
675f5736e95SDavid du Colombier continue;
676f5736e95SDavid du Colombier }
677f5736e95SDavid du Colombier usTmp = usGetWord(tOffset + 4, aucBuffer);
678f5736e95SDavid du Colombier usStyleType = usTmp % 16;
679f5736e95SDavid du Colombier usBaseStyle = usTmp / 16;
680f5736e95SDavid du Colombier NO_DBG_DEC(usStyleType);
681f5736e95SDavid du Colombier NO_DBG_DEC(usBaseStyle);
682f5736e95SDavid du Colombier if (usBaseStyle == STI_NIL || usBaseStyle == STI_USER) {
683f5736e95SDavid du Colombier /* Based on the Nil style */
684f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
685*25b329d5SDavid du Colombier vGetDefaultFont(pFont, usFtcStandardChpStsh);
686f5736e95SDavid du Colombier } else {
687f5736e95SDavid du Colombier iBaseStyleIndex = iGetStyleIndex(usBaseStyle);
688f5736e95SDavid du Colombier NO_DBG_DEC(iBaseStyleIndex);
689f5736e95SDavid du Colombier if (iBaseStyleIndex < 0) {
690f5736e95SDavid du Colombier /* This base style is not known yet */
691f5736e95SDavid du Colombier continue;
692f5736e95SDavid du Colombier }
693f5736e95SDavid du Colombier fail(iBaseStyleIndex >= (int)tStdCount);
694f5736e95SDavid du Colombier fail(!abFilled[iBaseStyleIndex]);
695f5736e95SDavid du Colombier /* Based on the specified base style */
696f5736e95SDavid du Colombier *pStyle = atStyleInfo[iBaseStyleIndex];
697f5736e95SDavid du Colombier pStyle->usIstd = ISTD_INVALID;
698f5736e95SDavid du Colombier *pFont = atFontInfo[iBaseStyleIndex];
699f5736e95SDavid du Colombier }
700f5736e95SDavid du Colombier abFilled[iIndex] = TRUE;
701f5736e95SDavid du Colombier iCounter++;
702f5736e95SDavid du Colombier /* STD */
703f5736e95SDavid du Colombier usTmp = usGetWord(tOffset + 6, aucBuffer);
704f5736e95SDavid du Colombier usUpxCount = usTmp % 16;
705f5736e95SDavid du Colombier pStyle->usIstdNext = usTmp / 16;
706f5736e95SDavid du Colombier NO_DBG_DEC(usUpxCount);
707f5736e95SDavid du Colombier tPos = 2 + tStdBaseInFile;
708f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
709f5736e95SDavid du Colombier tNameLen = (size_t)usGetWord(tOffset + tPos, aucBuffer);
710f5736e95SDavid du Colombier NO_DBG_DEC(tNameLen);
711f5736e95SDavid du Colombier tNameLen *= 2; /* From Unicode characters to bytes */
712f5736e95SDavid du Colombier NO_DBG_UNICODE_N(aucBuffer + tOffset + tPos + 2,
713f5736e95SDavid du Colombier tNameLen);
714f5736e95SDavid du Colombier tNameLen += 2; /* Include the Unicode NULL character */
715f5736e95SDavid du Colombier tPos += 2 + tNameLen;
716f5736e95SDavid du Colombier if (odd(tPos)) {
717f5736e95SDavid du Colombier tPos++;
718f5736e95SDavid du Colombier }
719f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
720f5736e95SDavid du Colombier if (tPos >= tStdLen) {
721f5736e95SDavid du Colombier continue;
722f5736e95SDavid du Colombier }
723f5736e95SDavid du Colombier tUpxLen = (size_t)usGetWord(tOffset + tPos, aucBuffer);
724f5736e95SDavid du Colombier NO_DBG_DEC(tUpxLen);
725f5736e95SDavid du Colombier if (tPos + tUpxLen > tStdLen) {
726f5736e95SDavid du Colombier /* UPX length too large to be a record */
727f5736e95SDavid du Colombier DBG_DEC_C(tPos + tUpxLen > tStdLen,
728f5736e95SDavid du Colombier tPos + tUpxLen);
729f5736e95SDavid du Colombier continue;
730f5736e95SDavid du Colombier }
731f5736e95SDavid du Colombier if (usStyleType == SGC_PAP && usUpxCount >= 1) {
732f5736e95SDavid du Colombier if (tUpxLen >= 2) {
733f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(
734f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
735f5736e95SDavid du Colombier tUpxLen);
736f5736e95SDavid du Colombier pStyle->usIstd = usGetWord(
737f5736e95SDavid du Colombier tOffset + tPos + 2, aucBuffer);
738f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->usIstd);
739f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->usIstdNext);
740f5736e95SDavid du Colombier vGet8StyleInfo(0,
741f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 4,
742f5736e95SDavid du Colombier tUpxLen - 2, pStyle);
743f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->sLeftIndent);
744f5736e95SDavid du Colombier NO_DBG_DEC(pStyle->sRightIndent);
745f5736e95SDavid du Colombier NO_DBG_HEX(pStyle->ucAlignment);
746f5736e95SDavid du Colombier }
747f5736e95SDavid du Colombier tPos += 2 + tUpxLen;
748f5736e95SDavid du Colombier if (odd(tPos)) {
749f5736e95SDavid du Colombier tPos++;
750f5736e95SDavid du Colombier }
751f5736e95SDavid du Colombier NO_DBG_DEC(tPos);
752f5736e95SDavid du Colombier tUpxLen = (size_t)usGetWord(
753f5736e95SDavid du Colombier tOffset + tPos, aucBuffer);
754f5736e95SDavid du Colombier NO_DBG_DEC(tUpxLen);
755f5736e95SDavid du Colombier }
756f5736e95SDavid du Colombier if (tUpxLen == 0 || tPos + tUpxLen > tStdLen) {
757f5736e95SDavid du Colombier /* Too small or too large to be a record */
758f5736e95SDavid du Colombier DBG_DEC_C(tPos + tUpxLen > tStdLen,
759f5736e95SDavid du Colombier tPos + tUpxLen);
760f5736e95SDavid du Colombier continue;
761f5736e95SDavid du Colombier }
762f5736e95SDavid du Colombier if ((usStyleType == SGC_PAP && usUpxCount >= 2) ||
763f5736e95SDavid du Colombier (usStyleType == SGC_CHP && usUpxCount >= 1)) {
764f5736e95SDavid du Colombier NO_DBG_PRINT_BLOCK(
765f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
766f5736e95SDavid du Colombier tUpxLen);
767f5736e95SDavid du Colombier vGet8FontInfo(0, ISTD_INVALID,
768f5736e95SDavid du Colombier aucBuffer + tOffset + tPos + 2,
769f5736e95SDavid du Colombier (int)tUpxLen, pFont);
770f5736e95SDavid du Colombier NO_DBG_DEC(pFont->usFontSize);
771f5736e95SDavid du Colombier NO_DBG_DEC(pFont->ucFontcolor);
772f5736e95SDavid du Colombier NO_DBG_HEX(pFont->usFontStyle);
773f5736e95SDavid du Colombier }
774f5736e95SDavid du Colombier }
775f5736e95SDavid du Colombier NO_DBG_DEC(iCounter);
776f5736e95SDavid du Colombier } while (iCounter > 0);
777f5736e95SDavid du Colombier
778*25b329d5SDavid du Colombier /* Fill records that are still empty */
779f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
780f5736e95SDavid du Colombier if (!abFilled[iIndex]) {
781f5736e95SDavid du Colombier NO_DBG_DEC(iIndex);
782f5736e95SDavid du Colombier vGetDefaultStyle(&atStyleInfo[iIndex]);
783*25b329d5SDavid du Colombier vGetDefaultFont(&atFontInfo[iIndex],
784*25b329d5SDavid du Colombier usFtcStandardChpStsh);
785f5736e95SDavid du Colombier }
786f5736e95SDavid du Colombier }
787f5736e95SDavid du Colombier
788*25b329d5SDavid du Colombier /* Clean up before you leave */
789f5736e95SDavid du Colombier abFilled = xfree(abFilled);
790f5736e95SDavid du Colombier aucBuffer = xfree(aucBuffer);
791f5736e95SDavid du Colombier } /* end of vGet8Stylesheet */
792f5736e95SDavid du Colombier
793f5736e95SDavid du Colombier /*
794f5736e95SDavid du Colombier * vFillStyleFromStylesheet - fill a style struct with stylesheet info
795f5736e95SDavid du Colombier */
796f5736e95SDavid du Colombier void
vFillStyleFromStylesheet(USHORT usIstd,style_block_type * pStyle)797f5736e95SDavid du Colombier vFillStyleFromStylesheet(USHORT usIstd, style_block_type *pStyle)
798f5736e95SDavid du Colombier {
799f5736e95SDavid du Colombier int iIndex;
800f5736e95SDavid du Colombier
801f5736e95SDavid du Colombier fail(pStyle == NULL);
802f5736e95SDavid du Colombier
803f5736e95SDavid du Colombier if (usIstd != ISTD_INVALID && usIstd != STI_NIL && usIstd != STI_USER) {
804f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
805f5736e95SDavid du Colombier if (atStyleInfo[iIndex].usIstd == usIstd) {
806f5736e95SDavid du Colombier /* Right index found; return style */
807f5736e95SDavid du Colombier *pStyle = atStyleInfo[iIndex];
808f5736e95SDavid du Colombier return;
809f5736e95SDavid du Colombier }
810f5736e95SDavid du Colombier }
811f5736e95SDavid du Colombier }
812f5736e95SDavid du Colombier
813f5736e95SDavid du Colombier vGetDefaultStyle(pStyle);
814f5736e95SDavid du Colombier pStyle->usIstd = usIstd;
815f5736e95SDavid du Colombier } /* end of vFillStyleFromStylesheet */
816f5736e95SDavid du Colombier
817f5736e95SDavid du Colombier /*
818f5736e95SDavid du Colombier * vFillFontFromStylesheet - fill a font struct with stylesheet info
819f5736e95SDavid du Colombier */
820f5736e95SDavid du Colombier void
vFillFontFromStylesheet(USHORT usIstd,font_block_type * pFont)821f5736e95SDavid du Colombier vFillFontFromStylesheet(USHORT usIstd, font_block_type *pFont)
822f5736e95SDavid du Colombier {
823f5736e95SDavid du Colombier int iIndex;
824f5736e95SDavid du Colombier
825f5736e95SDavid du Colombier fail(pFont == NULL);
826f5736e95SDavid du Colombier
827f5736e95SDavid du Colombier if (usIstd != ISTD_INVALID && usIstd != STI_NIL && usIstd != STI_USER) {
828f5736e95SDavid du Colombier for (iIndex = 0; iIndex < (int)tStdCount; iIndex++) {
829f5736e95SDavid du Colombier if (atStyleInfo[iIndex].usIstd == usIstd) {
830f5736e95SDavid du Colombier /* Right index found; return font */
831f5736e95SDavid du Colombier *pFont = atFontInfo[iIndex];
832f5736e95SDavid du Colombier return;
833f5736e95SDavid du Colombier }
834f5736e95SDavid du Colombier }
835f5736e95SDavid du Colombier }
836f5736e95SDavid du Colombier
837*25b329d5SDavid du Colombier vGetDefaultFont(pFont, 0);
838f5736e95SDavid du Colombier } /* end of vFillFontFromStylesheet */
839