tabstop.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * tabstops.c
  3. * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL
  4. *
  5. * Description:
  6. * Read the tab stop information from a MS Word file
  7. */
  8. #include <stdio.h>
  9. #include "antiword.h"
  10. #define HALF_INCH 36000L /* In millipoints */
  11. static long lDefaultTabWidth = HALF_INCH;
  12. /*
  13. * vSet0DefaultTabWidth -
  14. */
  15. static void
  16. vSet0DefaultTabWidth(const UCHAR *aucHeader)
  17. {
  18. USHORT usTmp;
  19. fail(aucHeader == NULL);
  20. usTmp = usGetWord(0x70, aucHeader); /* dxaTab */
  21. DBG_DEC(usTmp);
  22. lDefaultTabWidth = usTmp == 0 ? HALF_INCH : lTwips2MilliPoints(usTmp);
  23. DBG_DEC(lDefaultTabWidth);
  24. } /* end of vSet0DefaultTabWidth */
  25. /*
  26. * vSet2DefaultTabWidth -
  27. */
  28. static void
  29. vSet2DefaultTabWidth(FILE *pFile, const UCHAR *aucHeader)
  30. {
  31. UCHAR *aucBuffer;
  32. ULONG ulBeginDocpInfo;
  33. size_t tDocpInfoLen;
  34. USHORT usTmp;
  35. fail(pFile == NULL || aucHeader == NULL);
  36. ulBeginDocpInfo = ulGetLong(0x112, aucHeader); /* fcDop */
  37. DBG_HEX(ulBeginDocpInfo);
  38. tDocpInfoLen = (size_t)usGetWord(0x116, aucHeader); /* cbDop */
  39. DBG_DEC(tDocpInfoLen);
  40. if (tDocpInfoLen < 12) {
  41. DBG_MSG("No TAB information");
  42. return;
  43. }
  44. aucBuffer = xmalloc(tDocpInfoLen);
  45. if (!bReadBytes(aucBuffer, tDocpInfoLen, ulBeginDocpInfo, pFile)) {
  46. aucBuffer = xfree(aucBuffer);
  47. return;
  48. }
  49. usTmp = usGetWord(0x0a, aucBuffer); /* dxaTab */
  50. lDefaultTabWidth = usTmp == 0 ? HALF_INCH : lTwips2MilliPoints(usTmp);
  51. DBG_DEC(lDefaultTabWidth);
  52. aucBuffer = xfree(aucBuffer);
  53. } /* end of vSet2DefaultTabWidth */
  54. /*
  55. * vSet6DefaultTabWidth -
  56. */
  57. static void
  58. vSet6DefaultTabWidth(FILE *pFile, ULONG ulStartBlock,
  59. const ULONG *aulBBD, size_t tBBDLen, const UCHAR *aucHeader)
  60. {
  61. UCHAR *aucBuffer;
  62. ULONG ulBeginDocpInfo;
  63. size_t tDocpInfoLen;
  64. USHORT usTmp;
  65. ulBeginDocpInfo = ulGetLong(0x150, aucHeader); /* fcDop */
  66. DBG_HEX(ulBeginDocpInfo);
  67. tDocpInfoLen = (size_t)ulGetLong(0x154, aucHeader); /* lcbDop */
  68. DBG_DEC(tDocpInfoLen);
  69. if (tDocpInfoLen < 12) {
  70. DBG_MSG("No TAB information");
  71. return;
  72. }
  73. aucBuffer = xmalloc(tDocpInfoLen);
  74. if (!bReadBuffer(pFile, ulStartBlock,
  75. aulBBD, tBBDLen, BIG_BLOCK_SIZE,
  76. aucBuffer, ulBeginDocpInfo, tDocpInfoLen)) {
  77. aucBuffer = xfree(aucBuffer);
  78. return;
  79. }
  80. usTmp = usGetWord(0x0a, aucBuffer); /* dxaTab */
  81. lDefaultTabWidth = usTmp == 0 ? HALF_INCH : lTwips2MilliPoints(usTmp);
  82. DBG_DEC(lDefaultTabWidth);
  83. aucBuffer = xfree(aucBuffer);
  84. } /* end of vSet6DefaultTabWidth */
  85. /*
  86. * vSet8DefaultTabWidth -
  87. */
  88. static void
  89. vSet8DefaultTabWidth(FILE *pFile, const pps_info_type *pPPS,
  90. const ULONG *aulBBD, size_t tBBDLen,
  91. const ULONG *aulSBD, size_t tSBDLen,
  92. const UCHAR *aucHeader)
  93. {
  94. const ULONG *aulBlockDepot;
  95. UCHAR *aucBuffer;
  96. ULONG ulBeginDocpInfo;
  97. size_t tDocpInfoLen, tBlockDepotLen, tBlockSize;
  98. USHORT usTmp;
  99. ulBeginDocpInfo = ulGetLong(0x192, aucHeader); /* fcDop */
  100. DBG_HEX(ulBeginDocpInfo);
  101. tDocpInfoLen = (size_t)ulGetLong(0x196, aucHeader); /* lcbDop */
  102. DBG_DEC(tDocpInfoLen);
  103. if (tDocpInfoLen < 12) {
  104. DBG_MSG("No TAB information");
  105. return;
  106. }
  107. DBG_DEC(pPPS->tTable.ulSB);
  108. DBG_HEX(pPPS->tTable.ulSize);
  109. if (pPPS->tTable.ulSize == 0) {
  110. DBG_MSG("No TAB information");
  111. return;
  112. }
  113. if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
  114. /* Use the Small Block Depot */
  115. aulBlockDepot = aulSBD;
  116. tBlockDepotLen = tSBDLen;
  117. tBlockSize = SMALL_BLOCK_SIZE;
  118. } else {
  119. /* Use the Big Block Depot */
  120. aulBlockDepot = aulBBD;
  121. tBlockDepotLen = tBBDLen;
  122. tBlockSize = BIG_BLOCK_SIZE;
  123. }
  124. aucBuffer = xmalloc(tDocpInfoLen);
  125. if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
  126. aulBlockDepot, tBlockDepotLen, tBlockSize,
  127. aucBuffer, ulBeginDocpInfo, tDocpInfoLen)) {
  128. aucBuffer = xfree(aucBuffer);
  129. return;
  130. }
  131. usTmp = usGetWord(0x0a, aucBuffer); /* dxaTab */
  132. lDefaultTabWidth = usTmp == 0 ? HALF_INCH : lTwips2MilliPoints(usTmp);
  133. DBG_DEC(lDefaultTabWidth);
  134. aucBuffer = xfree(aucBuffer);
  135. } /* end of vSet8DefaultTabWidth */
  136. /*
  137. * vSetDefaultTabWidth -
  138. */
  139. void
  140. vSetDefaultTabWidth(FILE *pFile, const pps_info_type *pPPS,
  141. const ULONG *aulBBD, size_t tBBDLen,
  142. const ULONG *aulSBD, size_t tSBDLen,
  143. const UCHAR *aucHeader, int iWordVersion)
  144. {
  145. fail(pFile == NULL && iWordVersion >= 1);
  146. fail(pPPS == NULL && iWordVersion >= 6);
  147. fail(aulBBD == NULL && tBBDLen != 0);
  148. fail(aulSBD == NULL && tSBDLen != 0);
  149. fail(aucHeader == NULL);
  150. /* Reset to the default default value */
  151. lDefaultTabWidth = HALF_INCH;
  152. switch (iWordVersion) {
  153. case 0:
  154. vSet0DefaultTabWidth(aucHeader);
  155. break;
  156. case 1:
  157. case 2:
  158. vSet2DefaultTabWidth(pFile, aucHeader);
  159. break;
  160. case 4:
  161. case 5:
  162. break;
  163. case 6:
  164. case 7:
  165. vSet6DefaultTabWidth(pFile, pPPS->tWordDocument.ulSB,
  166. aulBBD, tBBDLen, aucHeader);
  167. break;
  168. case 8:
  169. vSet8DefaultTabWidth(pFile, pPPS,
  170. aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
  171. break;
  172. default:
  173. werr(0, "Sorry, no TAB information");
  174. break;
  175. }
  176. } /* end of vSetDefaultTabWidth */
  177. #if 0
  178. /*
  179. * lGetDefaultTabWidth - Get the default tabwidth in millipoints
  180. */
  181. long
  182. lGetDefaultTabWidth(void)
  183. {
  184. if (lDefaultTabWidth <= 0) {
  185. DBG_DEC(lDefaultTabWidth);
  186. return lTwips2MilliPoints(1);
  187. }
  188. return lDefaultTabWidth;
  189. } /* end of lGetDefaultTabWidth */
  190. #endif