xref: /plan9/sys/src/cmd/aux/antiword/rowlist.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
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
vDestroyRowInfoList(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
vAdd2RowInfoList(const row_block_type * pRowBlock)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 *
pGetNextRowInfoListItem(void)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 */
118