mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
/*
|
|
* propmod.c
|
|
* Copyright (C) 2001-2003 A.J. van Os; Released under GPL
|
|
*
|
|
* Description:
|
|
* Build, read and destroy a list (array) of Word property modifiers
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "antiword.h"
|
|
|
|
#if defined(DEBUG)
|
|
#define ELEMENTS_TO_ADD 3
|
|
#else
|
|
#define ELEMENTS_TO_ADD 30
|
|
#endif /* DEBUG */
|
|
|
|
/* Variables needed to write the property modifier list */
|
|
static __thread UCHAR **ppAnchor = NULL;
|
|
static __thread size_t tNextFree = 0;
|
|
static __thread size_t tMaxElements = 0;
|
|
|
|
|
|
/*
|
|
* vDestroyPropModList - destroy the property modifier list
|
|
*/
|
|
void
|
|
vDestroyPropModList(void)
|
|
{
|
|
size_t tIndex;
|
|
|
|
DBG_MSG("vDestroyPropModList");
|
|
|
|
/* Free all the elements of the list */
|
|
for (tIndex = 0; tIndex < tNextFree; tIndex++) {
|
|
ppAnchor[tIndex] = xfree(ppAnchor[tIndex]);
|
|
}
|
|
/* Free the list itself */
|
|
ppAnchor = xfree(ppAnchor);
|
|
/* Reset all control variables */
|
|
tNextFree = 0;
|
|
tMaxElements = 0;
|
|
} /* end of vDestroyPropModList */
|
|
|
|
/*
|
|
* vAdd2PropModList - add an element to the property modifier list
|
|
*/
|
|
void
|
|
vAdd2PropModList(const UCHAR *aucPropMod)
|
|
{
|
|
size_t tSize, tLen;
|
|
|
|
fail(aucPropMod == NULL);
|
|
|
|
NO_DBG_MSG("vAdd2PropModList");
|
|
|
|
if (tNextFree >= tMaxElements) {
|
|
tMaxElements += ELEMENTS_TO_ADD;
|
|
tSize = tMaxElements * sizeof(UCHAR **);
|
|
ppAnchor = xrealloc(ppAnchor, tSize);
|
|
}
|
|
NO_DBG_DEC(tNextFree);
|
|
|
|
tLen = 2 + (size_t)usGetWord(0, aucPropMod);
|
|
NO_DBG_HEX(tLen);
|
|
NO_DBG_PRINT_BLOCK(pucPropMod, tLen);
|
|
ppAnchor[tNextFree] = xmalloc(tLen);
|
|
memcpy(ppAnchor[tNextFree], aucPropMod, tLen);
|
|
tNextFree++;
|
|
} /* end of vAdd2PropModList */
|
|
|
|
/*
|
|
* aucReadPropModListItem - get an item of the property modifier list
|
|
*/
|
|
const UCHAR *
|
|
aucReadPropModListItem(USHORT usPropMod)
|
|
{
|
|
static UCHAR aucBuffer[4];
|
|
size_t tIndex;
|
|
|
|
if (usPropMod == IGNORE_PROPMOD) {
|
|
/* This Properties Modifier must be ignored */
|
|
return NULL;
|
|
}
|
|
|
|
if (!odd(usPropMod)) {
|
|
/* Variant 1: The information is in the input ifself */
|
|
aucBuffer[0] = 2;
|
|
aucBuffer[1] = 0;
|
|
aucBuffer[2] = (UCHAR)((usPropMod & 0x00fe) >> 1);
|
|
aucBuffer[3] = (UCHAR)((usPropMod & 0xff00) >> 8);
|
|
return aucBuffer;
|
|
}
|
|
|
|
if (ppAnchor == NULL) {
|
|
/* No information available */
|
|
return NULL;
|
|
}
|
|
|
|
/* Variant 2: The input contains an index */
|
|
tIndex = (size_t)(usPropMod >> 1);
|
|
if (tIndex >= tNextFree) {
|
|
DBG_HEX(usPropMod);
|
|
DBG_DEC(tIndex);
|
|
DBG_DEC(tNextFree);
|
|
return NULL;
|
|
}
|
|
return ppAnchor[tIndex];
|
|
} /* end of aucGetPropModListItem */
|