xref: /plan9/sys/src/cmd/aux/antiword/propmod.c (revision f5736e95f14e1485b3a0291fa82d86cca323ab61)
1*f5736e95SDavid du Colombier /*
2*f5736e95SDavid du Colombier  * propmod.c
3*f5736e95SDavid du Colombier  * Copyright (C) 2001-2003 A.J. van Os; Released under GPL
4*f5736e95SDavid du Colombier  *
5*f5736e95SDavid du Colombier  * Description:
6*f5736e95SDavid du Colombier  * Build, read and destroy a list (array) of Word property modifiers
7*f5736e95SDavid du Colombier  */
8*f5736e95SDavid du Colombier 
9*f5736e95SDavid du Colombier #include <stdio.h>
10*f5736e95SDavid du Colombier #include <string.h>
11*f5736e95SDavid du Colombier #include "antiword.h"
12*f5736e95SDavid du Colombier 
13*f5736e95SDavid du Colombier #if defined(DEBUG)
14*f5736e95SDavid du Colombier #define ELEMENTS_TO_ADD	 3
15*f5736e95SDavid du Colombier #else
16*f5736e95SDavid du Colombier #define ELEMENTS_TO_ADD	30
17*f5736e95SDavid du Colombier #endif /* DEBUG */
18*f5736e95SDavid du Colombier 
19*f5736e95SDavid du Colombier /* Variables needed to write the property modifier list */
20*f5736e95SDavid du Colombier static UCHAR	**ppAnchor = NULL;
21*f5736e95SDavid du Colombier static size_t	tNextFree = 0;
22*f5736e95SDavid du Colombier static size_t	tMaxElements = 0;
23*f5736e95SDavid du Colombier 
24*f5736e95SDavid du Colombier 
25*f5736e95SDavid du Colombier /*
26*f5736e95SDavid du Colombier  * vDestroyPropModList - destroy the property modifier list
27*f5736e95SDavid du Colombier  */
28*f5736e95SDavid du Colombier void
vDestroyPropModList(void)29*f5736e95SDavid du Colombier vDestroyPropModList(void)
30*f5736e95SDavid du Colombier {
31*f5736e95SDavid du Colombier 	size_t	tIndex;
32*f5736e95SDavid du Colombier 
33*f5736e95SDavid du Colombier 	DBG_MSG("vDestroyPropModList");
34*f5736e95SDavid du Colombier 
35*f5736e95SDavid du Colombier 	/* Free all the elements of the list */
36*f5736e95SDavid du Colombier 	for (tIndex = 0; tIndex < tNextFree; tIndex++) {
37*f5736e95SDavid du Colombier 		ppAnchor[tIndex] = xfree(ppAnchor[tIndex]);
38*f5736e95SDavid du Colombier 	}
39*f5736e95SDavid du Colombier 	/* Free the list itself */
40*f5736e95SDavid du Colombier 	ppAnchor = xfree(ppAnchor);
41*f5736e95SDavid du Colombier 	/* Reset all control variables */
42*f5736e95SDavid du Colombier 	tNextFree = 0;
43*f5736e95SDavid du Colombier 	tMaxElements = 0;
44*f5736e95SDavid du Colombier } /* end of vDestroyPropModList */
45*f5736e95SDavid du Colombier 
46*f5736e95SDavid du Colombier /*
47*f5736e95SDavid du Colombier  * vAdd2PropModList - add an element to the property modifier list
48*f5736e95SDavid du Colombier  */
49*f5736e95SDavid du Colombier void
vAdd2PropModList(const UCHAR * aucPropMod)50*f5736e95SDavid du Colombier vAdd2PropModList(const UCHAR *aucPropMod)
51*f5736e95SDavid du Colombier {
52*f5736e95SDavid du Colombier 	size_t	tSize, tLen;
53*f5736e95SDavid du Colombier 
54*f5736e95SDavid du Colombier 	fail(aucPropMod == NULL);
55*f5736e95SDavid du Colombier 
56*f5736e95SDavid du Colombier 	NO_DBG_MSG("vAdd2PropModList");
57*f5736e95SDavid du Colombier 
58*f5736e95SDavid du Colombier 	if (tNextFree >= tMaxElements) {
59*f5736e95SDavid du Colombier 		tMaxElements += ELEMENTS_TO_ADD;
60*f5736e95SDavid du Colombier 		tSize = tMaxElements * sizeof(UCHAR **);
61*f5736e95SDavid du Colombier 		ppAnchor = xrealloc(ppAnchor, tSize);
62*f5736e95SDavid du Colombier 	}
63*f5736e95SDavid du Colombier 	NO_DBG_DEC(tNextFree);
64*f5736e95SDavid du Colombier 
65*f5736e95SDavid du Colombier 	tLen = 2 + (size_t)usGetWord(0, aucPropMod);
66*f5736e95SDavid du Colombier 	NO_DBG_HEX(tLen);
67*f5736e95SDavid du Colombier 	NO_DBG_PRINT_BLOCK(pucPropMod, tLen);
68*f5736e95SDavid du Colombier 	ppAnchor[tNextFree] = xmalloc(tLen);
69*f5736e95SDavid du Colombier 	memcpy(ppAnchor[tNextFree], aucPropMod, tLen);
70*f5736e95SDavid du Colombier 	tNextFree++;
71*f5736e95SDavid du Colombier } /* end of vAdd2PropModList */
72*f5736e95SDavid du Colombier 
73*f5736e95SDavid du Colombier /*
74*f5736e95SDavid du Colombier  * aucReadPropModListItem - get an item of the property modifier list
75*f5736e95SDavid du Colombier  */
76*f5736e95SDavid du Colombier const UCHAR *
aucReadPropModListItem(USHORT usPropMod)77*f5736e95SDavid du Colombier aucReadPropModListItem(USHORT usPropMod)
78*f5736e95SDavid du Colombier {
79*f5736e95SDavid du Colombier 	static UCHAR	aucBuffer[4];
80*f5736e95SDavid du Colombier 	size_t	tIndex;
81*f5736e95SDavid du Colombier 
82*f5736e95SDavid du Colombier 	if (usPropMod == IGNORE_PROPMOD) {
83*f5736e95SDavid du Colombier 		/* This Properties Modifier must be ignored */
84*f5736e95SDavid du Colombier 		return NULL;
85*f5736e95SDavid du Colombier 	}
86*f5736e95SDavid du Colombier 
87*f5736e95SDavid du Colombier 	if (!odd(usPropMod)) {
88*f5736e95SDavid du Colombier 		/* Variant 1: The information is in the input ifself */
89*f5736e95SDavid du Colombier 		aucBuffer[0] = 2;
90*f5736e95SDavid du Colombier 		aucBuffer[1] = 0;
91*f5736e95SDavid du Colombier 		aucBuffer[2] = (UCHAR)((usPropMod & 0x00fe) >> 1);
92*f5736e95SDavid du Colombier 		aucBuffer[3] = (UCHAR)((usPropMod & 0xff00) >> 8);
93*f5736e95SDavid du Colombier 		return aucBuffer;
94*f5736e95SDavid du Colombier 	}
95*f5736e95SDavid du Colombier 
96*f5736e95SDavid du Colombier 	if (ppAnchor == NULL) {
97*f5736e95SDavid du Colombier 		/* No information available */
98*f5736e95SDavid du Colombier 		return NULL;
99*f5736e95SDavid du Colombier 	}
100*f5736e95SDavid du Colombier 
101*f5736e95SDavid du Colombier 	/* Variant 2: The input contains an index */
102*f5736e95SDavid du Colombier 	tIndex = (size_t)(usPropMod >> 1);
103*f5736e95SDavid du Colombier 	if (tIndex >= tNextFree) {
104*f5736e95SDavid du Colombier 		DBG_HEX(usPropMod);
105*f5736e95SDavid du Colombier 		DBG_DEC(tIndex);
106*f5736e95SDavid du Colombier 		DBG_DEC(tNextFree);
107*f5736e95SDavid du Colombier 		return NULL;
108*f5736e95SDavid du Colombier 	}
109*f5736e95SDavid du Colombier 	return ppAnchor[tIndex];
110*f5736e95SDavid du Colombier } /* end of aucGetPropModListItem */
111