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 ColombiervDestroyPropModList(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 ColombiervAdd2PropModList(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 ColombieraucReadPropModListItem(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