xref: /plan9/sys/src/cmd/aux/antiword/properties.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * properties.c
3*25b329d5SDavid du Colombier  * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Read the properties information from a MS Word file
7f5736e95SDavid du Colombier  */
8f5736e95SDavid du Colombier 
9f5736e95SDavid du Colombier #include <stdlib.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  * Build the lists with Property Information
16f5736e95SDavid du Colombier  */
17f5736e95SDavid du Colombier void
vGetPropertyInfo(FILE * pFile,const pps_info_type * pPPS,const ULONG * aulBBD,size_t tBBDLen,const ULONG * aulSBD,size_t tSBDLen,const UCHAR * aucHeader,int iWordVersion)18f5736e95SDavid du Colombier vGetPropertyInfo(FILE *pFile, const pps_info_type *pPPS,
19f5736e95SDavid du Colombier 	const ULONG *aulBBD, size_t tBBDLen,
20f5736e95SDavid du Colombier 	const ULONG *aulSBD, size_t tSBDLen,
21f5736e95SDavid du Colombier 	const UCHAR *aucHeader, int iWordVersion)
22f5736e95SDavid du Colombier {
23f5736e95SDavid du Colombier 	options_type	tOptions;
24f5736e95SDavid du Colombier 
25*25b329d5SDavid du Colombier 	TRACE_MSG("vGetPropertyInfo");
26*25b329d5SDavid du Colombier 
27f5736e95SDavid du Colombier 	fail(pFile == NULL);
28f5736e95SDavid du Colombier 	fail(pPPS == NULL && iWordVersion >= 6);
29f5736e95SDavid du Colombier 	fail(aulBBD == NULL && tBBDLen != 0);
30f5736e95SDavid du Colombier 	fail(aulSBD == NULL && tSBDLen != 0);
31f5736e95SDavid du Colombier 	fail(aucHeader == NULL);
32f5736e95SDavid du Colombier 
33*25b329d5SDavid du Colombier 	/* Get the options */
34f5736e95SDavid du Colombier 	vGetOptions(&tOptions);
35f5736e95SDavid du Colombier 
36*25b329d5SDavid du Colombier 	/* Get the property information per Word version */
37f5736e95SDavid du Colombier 	switch (iWordVersion) {
38f5736e95SDavid du Colombier 	case 0:
39*25b329d5SDavid du Colombier 		vGet0DopInfo(pFile, aucHeader);
40f5736e95SDavid du Colombier 		vGet0SepInfo(pFile, aucHeader);
41f5736e95SDavid du Colombier 		vGet0PapInfo(pFile, aucHeader);
42f5736e95SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
43f5736e95SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
44*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_xml ||
45*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_fmt_text ||
46*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
47f5736e95SDavid du Colombier 			vGet0ChrInfo(pFile, aucHeader);
48*25b329d5SDavid du Colombier 		}
49*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
50*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
51*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
52f5736e95SDavid du Colombier 			vCreate0FontTable();
53f5736e95SDavid du Colombier 		}
54f5736e95SDavid du Colombier 		vSet0SummaryInfo(pFile, aucHeader);
55f5736e95SDavid du Colombier 		break;
56f5736e95SDavid du Colombier 	case 1:
57f5736e95SDavid du Colombier 	case 2:
58f5736e95SDavid du Colombier 		vGet2Stylesheet(pFile, iWordVersion, aucHeader);
59*25b329d5SDavid du Colombier 		vGet2DopInfo(pFile, aucHeader);
60f5736e95SDavid du Colombier 		vGet2SepInfo(pFile, aucHeader);
61f5736e95SDavid du Colombier 		vGet2PapInfo(pFile, aucHeader);
62*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_ps ||
63*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
64*25b329d5SDavid du Colombier 			vGet2HdrFtrInfo(pFile, aucHeader);
65*25b329d5SDavid du Colombier 		}
66f5736e95SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
67f5736e95SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
68*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_xml ||
69*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_fmt_text ||
70*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
71f5736e95SDavid du Colombier 			vGet2ChrInfo(pFile, iWordVersion, aucHeader);
72*25b329d5SDavid du Colombier 		}
73*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
74*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
75*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
76*25b329d5SDavid du Colombier 			vCreate2FontTable(pFile, iWordVersion, aucHeader);
77f5736e95SDavid du Colombier 		}
78f5736e95SDavid du Colombier 		vSet2SummaryInfo(pFile, iWordVersion, aucHeader);
79f5736e95SDavid du Colombier 		break;
80f5736e95SDavid du Colombier 	case 4:
81f5736e95SDavid du Colombier 	case 5:
82f5736e95SDavid du Colombier 		break;
83f5736e95SDavid du Colombier 	case 6:
84f5736e95SDavid du Colombier 	case 7:
85f5736e95SDavid du Colombier 		vGet6Stylesheet(pFile, pPPS->tWordDocument.ulSB,
86f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aucHeader);
87*25b329d5SDavid du Colombier 		vGet6DopInfo(pFile, pPPS->tWordDocument.ulSB,
88*25b329d5SDavid du Colombier 			aulBBD, tBBDLen, aucHeader);
89f5736e95SDavid du Colombier 		vGet6SepInfo(pFile, pPPS->tWordDocument.ulSB,
90f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aucHeader);
91f5736e95SDavid du Colombier 		vGet6PapInfo(pFile, pPPS->tWordDocument.ulSB,
92f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aucHeader);
93*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_ps ||
94*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
95*25b329d5SDavid du Colombier 			vGet6HdrFtrInfo(pFile, pPPS->tWordDocument.ulSB,
96*25b329d5SDavid du Colombier 				aulBBD, tBBDLen, aucHeader);
97*25b329d5SDavid du Colombier 		}
98f5736e95SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
99f5736e95SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
100*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_xml ||
101*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_fmt_text ||
102*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
103f5736e95SDavid du Colombier 			vGet6ChrInfo(pFile, pPPS->tWordDocument.ulSB,
104f5736e95SDavid du Colombier 				aulBBD, tBBDLen, aucHeader);
105*25b329d5SDavid du Colombier 		}
106*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
107*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
108*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
109f5736e95SDavid du Colombier 			vCreate6FontTable(pFile, pPPS->tWordDocument.ulSB,
110f5736e95SDavid du Colombier 				aulBBD, tBBDLen, aucHeader);
111f5736e95SDavid du Colombier 		}
112f5736e95SDavid du Colombier 		vSet6SummaryInfo(pFile, pPPS,
113f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
114f5736e95SDavid du Colombier 		break;
115f5736e95SDavid du Colombier 	case 8:
116f5736e95SDavid du Colombier 		vGet8LstInfo(pFile, pPPS,
117f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
118f5736e95SDavid du Colombier 		vGet8Stylesheet(pFile, pPPS,
119f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
120*25b329d5SDavid du Colombier 		vGet8DopInfo(pFile, &pPPS->tTable,
121*25b329d5SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
122f5736e95SDavid du Colombier 		vGet8SepInfo(pFile, pPPS,
123f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
124f5736e95SDavid du Colombier 		vGet8PapInfo(pFile, pPPS,
125f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
126*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_ps ||
127*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
128*25b329d5SDavid du Colombier 			vGet8HdrFtrInfo(pFile, &pPPS->tTable,
129*25b329d5SDavid du Colombier 				aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
130*25b329d5SDavid du Colombier 		}
131f5736e95SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
132f5736e95SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
133*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_xml ||
134*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_fmt_text ||
135*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
136f5736e95SDavid du Colombier 			vGet8ChrInfo(pFile, pPPS,
137f5736e95SDavid du Colombier 				aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
138*25b329d5SDavid du Colombier 		}
139*25b329d5SDavid du Colombier 		if (tOptions.eConversionType == conversion_draw ||
140*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_ps ||
141*25b329d5SDavid du Colombier 		    tOptions.eConversionType == conversion_pdf) {
142f5736e95SDavid du Colombier 			vCreate8FontTable(pFile, pPPS,
143f5736e95SDavid du Colombier 				aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
144f5736e95SDavid du Colombier 		}
145f5736e95SDavid du Colombier 		vSet8SummaryInfo(pFile, pPPS,
146f5736e95SDavid du Colombier 			aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
147f5736e95SDavid du Colombier 		break;
148f5736e95SDavid du Colombier 	default:
149f5736e95SDavid du Colombier 		DBG_DEC(iWordVersion);
150f5736e95SDavid du Colombier 		DBG_FIXME();
151f5736e95SDavid du Colombier 		werr(0, "Sorry, no property information");
152f5736e95SDavid du Colombier 		break;
153f5736e95SDavid du Colombier 	}
154*25b329d5SDavid du Colombier 
155*25b329d5SDavid du Colombier 	/* Temporarily: Correct the font table */
156*25b329d5SDavid du Colombier 	vCorrectFontTable(tOptions.eConversionType, tOptions.eEncoding);
157f5736e95SDavid du Colombier } /* end of vGetPropertyInfo */
158f5736e95SDavid du Colombier 
159f5736e95SDavid du Colombier /*
160f5736e95SDavid du Colombier  * ePropMod2RowInfo - Turn the Property Modifier into row information
161f5736e95SDavid du Colombier  *
162f5736e95SDavid du Colombier  * Returns: the row information
163f5736e95SDavid du Colombier  */
164f5736e95SDavid du Colombier row_info_enum
ePropMod2RowInfo(USHORT usPropMod,int iWordVersion)165f5736e95SDavid du Colombier ePropMod2RowInfo(USHORT usPropMod, int iWordVersion)
166f5736e95SDavid du Colombier {
167f5736e95SDavid du Colombier 	row_block_type	tRow;
168f5736e95SDavid du Colombier 	const UCHAR	*aucPropMod;
169f5736e95SDavid du Colombier 	int	iLen;
170f5736e95SDavid du Colombier 
171*25b329d5SDavid du Colombier 	TRACE_MSG("ePropMod2RowInfo");
172*25b329d5SDavid du Colombier 
173f5736e95SDavid du Colombier 	aucPropMod = aucReadPropModListItem(usPropMod);
174f5736e95SDavid du Colombier 	if (aucPropMod == NULL) {
175f5736e95SDavid du Colombier 		return found_nothing;
176f5736e95SDavid du Colombier 	}
177f5736e95SDavid du Colombier 	iLen = (int)usGetWord(0, aucPropMod);
178f5736e95SDavid du Colombier 
179f5736e95SDavid du Colombier 	switch (iWordVersion) {
180f5736e95SDavid du Colombier 	case 0:
181f5736e95SDavid du Colombier 		return found_nothing;
182f5736e95SDavid du Colombier 	case 1:
183f5736e95SDavid du Colombier 	case 2:
184f5736e95SDavid du Colombier 		return eGet2RowInfo(0, aucPropMod + 2, iLen, &tRow);
185f5736e95SDavid du Colombier 	case 4:
186f5736e95SDavid du Colombier 	case 5:
187f5736e95SDavid du Colombier 		return found_nothing;
188f5736e95SDavid du Colombier 	case 6:
189f5736e95SDavid du Colombier 	case 7:
190f5736e95SDavid du Colombier 		return eGet6RowInfo(0, aucPropMod + 2, iLen, &tRow);
191f5736e95SDavid du Colombier 	case 8:
192f5736e95SDavid du Colombier 		return eGet8RowInfo(0, aucPropMod + 2, iLen, &tRow);
193f5736e95SDavid du Colombier 	default:
194f5736e95SDavid du Colombier 		DBG_DEC(iWordVersion);
195f5736e95SDavid du Colombier 		DBG_FIXME();
196f5736e95SDavid du Colombier 		return found_nothing;
197f5736e95SDavid du Colombier 	}
198f5736e95SDavid du Colombier } /* end of ePropMod2RowInfo */
199