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)33vDestroyRowInfoList(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)56vAdd2RowInfoList(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)107pGetNextRowInfoListItem(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