Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_tlsv12/sys/src/cmd/aux/antiword/rowlist.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * rowlist.c
3
 * Copyright (C) 1998-2004 A.J. van Os; Released under GPL
4
 *
5
 * Description:
6
 * Build, read and destroy a list of Word table-row information
7
 */
8
 
9
#include <stdlib.h>
10
#include <string.h>
11
#include "antiword.h"
12
 
13
/*
14
 * Private structure to hide the way the information
15
 * is stored from the rest of the program
16
 */
17
typedef struct row_desc_tag {
18
	row_block_type		tInfo;
19
	struct row_desc_tag	*pNext;
20
} row_desc_type;
21
 
22
/* Variables needed to write the Row Information List */
23
static row_desc_type	*pAnchor = NULL;
24
static row_desc_type	*pRowLast = NULL;
25
/* Variable needed to read the Row Information List */
26
static row_desc_type	*pRowCurrent = NULL;
27
 
28
 
29
/*
30
 * vDestroyRowInfoList - destroy the Row Information List
31
 */
32
void
33
vDestroyRowInfoList(void)
34
{
35
	row_desc_type	*pCurr, *pNext;
36
 
37
	DBG_MSG("vDestroyRowInfoList");
38
 
39
	/* Free the Row Information List */
40
	pCurr = pAnchor;
41
	while (pCurr != NULL) {
42
		pNext = pCurr->pNext;
43
		pCurr = xfree(pCurr);
44
		pCurr = pNext;
45
	}
46
	pAnchor = NULL;
47
	/* Reset all control variables */
48
	pRowLast = NULL;
49
	pRowCurrent = NULL;
50
} /* end of vDestroyRowInfoList */
51
 
52
/*
53
 * vAdd2RowInfoList - Add an element to the Row Information List
54
 */
55
void
56
vAdd2RowInfoList(const row_block_type *pRowBlock)
57
{
58
	row_desc_type	*pListMember;
59
	short		*psTmp;
60
	int		iIndex;
61
 
62
	fail(pRowBlock == NULL);
63
 
64
	if (pRowBlock->ulFileOffsetStart == FC_INVALID ||
65
	    pRowBlock->ulFileOffsetEnd == FC_INVALID ||
66
	    pRowBlock->ulFileOffsetStart == pRowBlock->ulFileOffsetEnd) {
67
		DBG_HEX_C(pRowBlock->ulFileOffsetStart != FC_INVALID,
68
			pRowBlock->ulFileOffsetStart);
69
		DBG_HEX_C(pRowBlock->ulFileOffsetEnd != FC_INVALID,
70
			pRowBlock->ulFileOffsetEnd);
71
		return;
72
	}
73
 
74
	NO_DBG_HEX(pRowBlock->ulFileOffsetStart);
75
	NO_DBG_HEX(pRowBlock->ulFileOffsetEnd);
76
	NO_DBG_DEC(pRowBlock->ucNumberOfColumns);
77
 
78
	/* Create the new list member */
79
	pListMember = xmalloc(sizeof(row_desc_type));
80
	/* Fill the new list member */
81
	pListMember->tInfo = *pRowBlock;
82
	pListMember->pNext = NULL;
83
	/* Correct the values where needed */
84
	for (iIndex = 0, psTmp = pListMember->tInfo.asColumnWidth;
85
	     iIndex < (int)pListMember->tInfo.ucNumberOfColumns;
86
	     iIndex++, psTmp++) {
87
		if (*psTmp < 0) {
88
			*psTmp = 0;
89
			DBG_MSG("The column width was negative");
90
		}
91
	}
92
	/* Add the new member to the list */
93
	if (pAnchor == NULL) {
94
		pAnchor = pListMember;
95
		pRowCurrent = pListMember;
96
	} else {
97
		fail(pRowLast == NULL);
98
		pRowLast->pNext = pListMember;
99
	}
100
	pRowLast = pListMember;
101
} /* end of vAdd2RowInfoList */
102
 
103
/*
104
 * Get the next item in the Row Information List
105
 */
106
const row_block_type *
107
pGetNextRowInfoListItem(void)
108
{
109
	const row_block_type	*pItem;
110
 
111
	if (pRowCurrent == NULL) {
112
		return NULL;
113
	}
114
	pItem = &pRowCurrent->tInfo;
115
	pRowCurrent = pRowCurrent->pNext;
116
	return pItem;
117
} /* end of pGetNextRowInfoListItem */