Imported from antiword-0.37.tar.gz.
[antiword.git] / rowlist.c
bloba3dd2fbcce6f7179faf61f5312de11f1726485b6
1 /*
2 * rowlist.c
3 * Copyright (C) 1998-2004 A.J. van Os; Released under GPL
5 * Description:
6 * Build, read and destroy a list of Word table-row information
7 */
9 #include <stdlib.h>
10 #include <string.h>
11 #include "antiword.h"
14 * Private structure to hide the way the information
15 * is stored from the rest of the program
17 typedef struct row_desc_tag {
18 row_block_type tInfo;
19 struct row_desc_tag *pNext;
20 } row_desc_type;
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;
30 * vDestroyRowInfoList - destroy the Row Information List
32 void
33 vDestroyRowInfoList(void)
35 row_desc_type *pCurr, *pNext;
37 DBG_MSG("vDestroyRowInfoList");
39 /* Free the Row Information List */
40 pCurr = pAnchor;
41 while (pCurr != NULL) {
42 pNext = pCurr->pNext;
43 pCurr = xfree(pCurr);
44 pCurr = pNext;
46 pAnchor = NULL;
47 /* Reset all control variables */
48 pRowLast = NULL;
49 pRowCurrent = NULL;
50 } /* end of vDestroyRowInfoList */
53 * vAdd2RowInfoList - Add an element to the Row Information List
55 void
56 vAdd2RowInfoList(const row_block_type *pRowBlock)
58 row_desc_type *pListMember;
59 short *psTmp;
60 int iIndex;
62 fail(pRowBlock == NULL);
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;
74 NO_DBG_HEX(pRowBlock->ulFileOffsetStart);
75 NO_DBG_HEX(pRowBlock->ulFileOffsetEnd);
76 NO_DBG_DEC(pRowBlock->ucNumberOfColumns);
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");
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;
100 pRowLast = pListMember;
101 } /* end of vAdd2RowInfoList */
104 * Get the next item in the Row Information List
106 const row_block_type *
107 pGetNextRowInfoListItem(void)
109 const row_block_type *pItem;
111 if (pRowCurrent == NULL) {
112 return NULL;
114 pItem = &pRowCurrent->tInfo;
115 pRowCurrent = pRowCurrent->pNext;
116 return pItem;
117 } /* end of pGetNextRowInfoListItem */