Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

756 lines
14 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1993.
  5. //
  6. // File: dstream.cpp
  7. //
  8. // Contents: internal debugging support (debug stream which builds a string)
  9. //
  10. // Classes: dbgstream implementation
  11. //
  12. // Functions:
  13. //
  14. // History: dd-mmm-yy Author Comment
  15. // 09-Feb-95 t-ScottH author
  16. //
  17. //--------------------------------------------------------------------------
  18. #include <le2int.h>
  19. #include <stdio.h>
  20. #include "dstream.h"
  21. //+-------------------------------------------------------------------------
  22. //
  23. // Member: dbgstream, public (_DEBUG only)
  24. //
  25. // Synopsis: constructor
  26. //
  27. // Effects: initializes and allocates buffer
  28. //
  29. // Arguments: [dwSize] - size of initial buffer to allocate
  30. //
  31. // Requires:
  32. //
  33. // Returns:
  34. //
  35. // Signals:
  36. //
  37. // Modifies:
  38. //
  39. // Derivation:
  40. //
  41. // Algorithm:
  42. //
  43. // History: dd-mmm-yy Author Comment
  44. // 11-Feb-95 t-ScottH author
  45. //
  46. // Notes:
  47. //
  48. //--------------------------------------------------------------------------
  49. #ifdef _DEBUG
  50. dbgstream::dbgstream(SIZE_T stSize)
  51. {
  52. init();
  53. allocate(stSize);
  54. if (m_stBufSize)
  55. {
  56. m_pszBuf[0] = '\0';
  57. }
  58. }
  59. #endif // _DEBUG
  60. //+-------------------------------------------------------------------------
  61. //
  62. // Member: dbgstream, public (_DEBUG only)
  63. //
  64. // Synopsis: constructor
  65. //
  66. // Effects: initializes and allocates buffer
  67. //
  68. // Arguments:
  69. //
  70. // Requires: DEFAULT_INITAL_ALLOC
  71. //
  72. // Returns:
  73. //
  74. // Signals:
  75. //
  76. // Modifies:
  77. //
  78. // Derivation:
  79. //
  80. // Algorithm:
  81. //
  82. // History: dd-mmm-yy Author Comment
  83. // 11-Feb-95 t-ScottH author
  84. //
  85. // Notes:
  86. // allocate the buffer with the default initial size
  87. //
  88. //--------------------------------------------------------------------------
  89. #ifdef _DEBUG
  90. dbgstream::dbgstream()
  91. {
  92. init();
  93. allocate(DEFAULT_INITIAL_ALLOC);
  94. if (m_stBufSize)
  95. {
  96. m_pszBuf[0] = '\0';
  97. }
  98. }
  99. #endif // _DEBUG
  100. //+-------------------------------------------------------------------------
  101. //
  102. // Member: ~dbgstream, public (_DEBUG only)
  103. //
  104. // Synopsis: destructor
  105. //
  106. // Effects: frees the string if m_fFrozen == FALSE
  107. //
  108. // Arguments:
  109. //
  110. // Requires:
  111. //
  112. // Returns:
  113. //
  114. // Signals:
  115. //
  116. // Modifies: frees the character array
  117. //
  118. // Derivation:
  119. //
  120. // Algorithm:
  121. //
  122. // History: dd-mmm-yy Author Comment
  123. // 11-Feb-95 t-ScottH author
  124. //
  125. // Notes:
  126. // we only want to free the string if it has not been passed off externally
  127. // using the str() method
  128. //
  129. //--------------------------------------------------------------------------
  130. #ifdef _DEBUG
  131. dbgstream::~dbgstream()
  132. {
  133. if (m_fFrozen == FALSE)
  134. {
  135. free();
  136. }
  137. }
  138. #endif // _DEBUG
  139. //+-------------------------------------------------------------------------
  140. //
  141. // Member: init, private (_DEBUG only)
  142. //
  143. // Synopsis: initializes the data members
  144. //
  145. // Effects: initializes radix to DEFAULT_RADIX,
  146. // precision to DEFAULT_PRECISION decimal places
  147. //
  148. // Arguments:
  149. //
  150. // Requires: DEFAULT_RADIX, DEFAULT_PRECISION
  151. //
  152. // Returns: void
  153. //
  154. // Signals:
  155. //
  156. // Modifies:
  157. //
  158. // Derivation:
  159. //
  160. // Algorithm:
  161. //
  162. // History: dd-mmm-yy Author Comment
  163. // 11-Feb-95 t-ScottH author
  164. //
  165. // Notes:
  166. //
  167. //--------------------------------------------------------------------------
  168. #ifdef _DEBUG
  169. void dbgstream::init()
  170. {
  171. m_stIndex = 0;
  172. m_stBufSize = 0;
  173. m_fFrozen = FALSE;
  174. m_radix = DEFAULT_RADIX;
  175. m_precision = DEFAULT_PRECISION;
  176. }
  177. #endif // _DEBUG
  178. //+-------------------------------------------------------------------------
  179. //
  180. // Member: allocate, private (_DEBUG only)
  181. //
  182. // Synopsis: allocate the buffer
  183. //
  184. // Effects: if allocates fail, freeze the buffer
  185. //
  186. // Arguments: [dwSize] - size of buffer to allocate (in bytes)
  187. //
  188. // Requires: CoTaskMemRealloc
  189. //
  190. // Returns: void
  191. //
  192. // Signals:
  193. //
  194. // Modifies:
  195. //
  196. // Derivation:
  197. //
  198. // Algorithm:
  199. //
  200. // History: dd-mmm-yy Author Comment
  201. // 11-Feb-95 t-ScottH author
  202. //
  203. // Notes:
  204. //
  205. //--------------------------------------------------------------------------
  206. #ifdef _DEBUG
  207. void dbgstream::allocate(SIZE_T stSize)
  208. {
  209. m_pszBuf = (char *)CoTaskMemAlloc(stSize);
  210. if (m_pszBuf == NULL)
  211. {
  212. m_fFrozen = TRUE;
  213. }
  214. else
  215. {
  216. m_stBufSize = stSize;
  217. }
  218. return;
  219. }
  220. #endif // _DEBUG
  221. //+-------------------------------------------------------------------------
  222. //
  223. // Member: free, private (_DEBUG only)
  224. //
  225. // Synopsis: frees the buffer (resets index and max size)
  226. //
  227. // Effects:
  228. //
  229. // Arguments: none
  230. //
  231. // Requires: CoTaskMemFree
  232. //
  233. // Returns: void
  234. //
  235. // Signals:
  236. //
  237. // Modifies:
  238. //
  239. // Derivation:
  240. //
  241. // Algorithm:
  242. //
  243. // History: dd-mmm-yy Author Comment
  244. // 11-Feb-95 t-ScottH author
  245. //
  246. // Notes:
  247. //
  248. //--------------------------------------------------------------------------
  249. #ifdef _DEBUG
  250. void dbgstream::free()
  251. {
  252. CoTaskMemFree(m_pszBuf);
  253. m_stIndex = 0;
  254. m_stBufSize = 0;
  255. }
  256. #endif // _DEBUG
  257. //+-------------------------------------------------------------------------
  258. //
  259. // Member: reallocate, private (_DEBUG only)
  260. //
  261. // Synopsis: reallocates the buffer (keeps data intact), depending on
  262. // current size this method will choose a growby size
  263. //
  264. // Effects:
  265. //
  266. // Arguments: none
  267. //
  268. // Requires: CoTaskMemRealloc, DEFAULT_GROWBY, DEFAULT_INITIAL_ALLOC
  269. //
  270. // Returns: void
  271. //
  272. // Signals:
  273. //
  274. // Modifies:
  275. //
  276. // Derivation:
  277. //
  278. // Algorithm:
  279. //
  280. // History: dd-mmm-yy Author Comment
  281. // 11-Feb-95 t-ScottH author
  282. //
  283. // Notes:
  284. // tried to make reallocation more efficient based upon current size
  285. // (I don't know any of the mathematical theory :-)
  286. //
  287. //--------------------------------------------------------------------------
  288. #ifdef _DEBUG
  289. void dbgstream::reallocate()
  290. {
  291. if (m_stBufSize < (DEFAULT_INITIAL_ALLOC * 2))
  292. {
  293. reallocate(DEFAULT_GROWBY);
  294. }
  295. else
  296. {
  297. reallocate(m_stBufSize/2);
  298. }
  299. }
  300. #endif // _DEBUG
  301. //+-------------------------------------------------------------------------
  302. //
  303. // Member: reallocate, private (_DEBUG only)
  304. //
  305. // Synopsis: reallocate the buffer (keep data intact)
  306. //
  307. // Effects: if reallocation fails, freeze the buffer
  308. //
  309. // Arguments: [dwSize] - amount to grow buffer by
  310. //
  311. // Requires: CoTaskMemRealloc
  312. //
  313. // Returns: void
  314. //
  315. // Signals:
  316. //
  317. // Modifies:
  318. //
  319. // Derivation:
  320. //
  321. // Algorithm:
  322. //
  323. // History: dd-mmm-yy Author Comment
  324. // 11-Feb-95 t-ScottH author
  325. //
  326. // Notes:
  327. // new buffer size = m_stBufSize + stSize
  328. //
  329. //--------------------------------------------------------------------------
  330. #ifdef _DEBUG
  331. void dbgstream::reallocate(SIZE_T stSize)
  332. {
  333. char *pszBuf;
  334. pszBuf = (char *)CoTaskMemRealloc(m_pszBuf, m_stBufSize + stSize);
  335. if (pszBuf != NULL)
  336. {
  337. m_pszBuf = pszBuf;
  338. m_stBufSize += stSize;
  339. }
  340. else
  341. {
  342. m_fFrozen = TRUE;
  343. }
  344. return;
  345. }
  346. #endif // _DEBUG
  347. //+-------------------------------------------------------------------------
  348. //
  349. // Member: freeze, public (_DEBUG only)
  350. //
  351. // Synopsis: freeze the buffer by throwing the flag
  352. //
  353. // Effects:
  354. //
  355. // Arguments: none
  356. //
  357. // Requires:
  358. //
  359. // Returns: BOOL - whether buffer was frozen (we are alway successful)
  360. //
  361. // Signals:
  362. //
  363. // Modifies:
  364. //
  365. // Derivation:
  366. //
  367. // Algorithm:
  368. //
  369. // History: dd-mmm-yy Author Comment
  370. // 11-Feb-95 t-ScottH author
  371. //
  372. // Notes:
  373. //
  374. //--------------------------------------------------------------------------
  375. #ifdef _DEBUG
  376. BOOL dbgstream::freeze()
  377. {
  378. m_fFrozen = TRUE;
  379. return TRUE;
  380. }
  381. #endif // _DEBUG
  382. //+-------------------------------------------------------------------------
  383. //
  384. // Member: unfreeze, public (_DEBUG only)
  385. //
  386. // Synopsis: unfreeze the buffer
  387. //
  388. // Effects: if buffer size = 0, allocate the buffer
  389. //
  390. // Arguments: none
  391. //
  392. // Requires:
  393. //
  394. // Returns: BOOL - whether successful
  395. //
  396. // Signals:
  397. //
  398. // Modifies:
  399. //
  400. // Derivation:
  401. //
  402. // Algorithm:
  403. //
  404. // History: dd-mmm-yy Author Comment
  405. // 11-Feb-95 t-ScottH author
  406. //
  407. // Notes:
  408. // buffer may be frozen if no memory, so try to allocate buffer if NULL
  409. //
  410. //--------------------------------------------------------------------------
  411. #ifdef _DEBUG
  412. BOOL dbgstream::unfreeze()
  413. {
  414. if (m_pszBuf == NULL)
  415. {
  416. allocate(DEFAULT_INITIAL_ALLOC);
  417. if (m_pszBuf == NULL)
  418. {
  419. return FALSE;
  420. }
  421. }
  422. m_fFrozen = FALSE;
  423. return TRUE;
  424. }
  425. #endif // _DEBUG
  426. //+-------------------------------------------------------------------------
  427. //
  428. // Member: str, public (_DEBUG only)
  429. //
  430. // Synopsis: passes the string externally
  431. //
  432. // Effects: freezes buffer until unfreeze method is called
  433. //
  434. // Arguments: none
  435. //
  436. // Requires:
  437. //
  438. // Returns: char * - buffer
  439. //
  440. // Signals:
  441. //
  442. // Modifies:
  443. //
  444. // Derivation:
  445. //
  446. // Algorithm:
  447. //
  448. // History: dd-mmm-yy Author Comment
  449. // 11-Feb-95 t-ScottH author
  450. //
  451. // Notes:
  452. //
  453. //--------------------------------------------------------------------------
  454. #ifdef _DEBUG
  455. char * dbgstream::str()
  456. {
  457. m_fFrozen = TRUE;
  458. return m_pszBuf;
  459. }
  460. #endif // _DEBUG
  461. //+-------------------------------------------------------------------------
  462. //
  463. // Member: overloaded operator<<(int), public (_DEBUG only)
  464. //
  465. // Synopsis: put int into stream (store in character buffer)
  466. //
  467. // Effects:
  468. //
  469. // Arguments: [i] - integer to put in stream
  470. //
  471. // Requires: _itoa
  472. //
  473. // Returns: reference to dbgstream (current object)
  474. //
  475. // Signals:
  476. //
  477. // Modifies:
  478. //
  479. // Derivation:
  480. //
  481. // Algorithm:
  482. //
  483. // History: dd-mmm-yy Author Comment
  484. // 11-Feb-95 t-ScottH author
  485. //
  486. // Notes:
  487. //
  488. //--------------------------------------------------------------------------
  489. #ifdef _DEBUG
  490. dbgstream& dbgstream::operator<<(int i)
  491. {
  492. // _itoa - fills up to 17 bytes
  493. char szBuffer[20];
  494. if (m_fFrozen == FALSE)
  495. {
  496. _itoa(i, szBuffer, m_radix);
  497. return (operator<<(szBuffer));
  498. }
  499. return *this;
  500. }
  501. #endif // _DEBUG
  502. //+-------------------------------------------------------------------------
  503. //
  504. // Member: overloaded operator<<(long), public (_DEBUG only)
  505. //
  506. // Synopsis: put long into stream (store in character buffer)
  507. //
  508. // Effects:
  509. //
  510. // Arguments: [l] - long to put in stream
  511. //
  512. // Requires: _ltoa
  513. //
  514. // Returns: reference to dbgstream (current object)
  515. //
  516. // Signals:
  517. //
  518. // Modifies:
  519. //
  520. // Derivation:
  521. //
  522. // Algorithm:
  523. //
  524. // History: dd-mmm-yy Author Comment
  525. // 11-Feb-95 t-ScottH author
  526. //
  527. // Notes:
  528. //
  529. //--------------------------------------------------------------------------
  530. #ifdef _DEBUG
  531. dbgstream& dbgstream::operator<<(long l)
  532. {
  533. // _ltoa - up to 33 bytes
  534. char szBuffer[35];
  535. if (m_fFrozen == FALSE)
  536. {
  537. _ltoa(l, szBuffer, m_radix);
  538. return (operator<<(szBuffer));
  539. }
  540. return *this;
  541. }
  542. #endif // _DEBUG
  543. //+-------------------------------------------------------------------------
  544. //
  545. // Member: overloaded operator<<(unsigned long), public (_DEBUG only)
  546. //
  547. // Synopsis: put unsigned long into stream (store in character buffer)
  548. //
  549. // Effects:
  550. //
  551. // Arguments: [ul] - long to put in stream
  552. //
  553. // Requires: _ultoa
  554. //
  555. // Returns: reference to dbgstream (current object)
  556. //
  557. // Signals:
  558. //
  559. // Modifies:
  560. //
  561. // Derivation:
  562. //
  563. // Algorithm:
  564. //
  565. // History: dd-mmm-yy Author Comment
  566. // 11-Feb-95 t-ScottH author
  567. //
  568. // Notes:
  569. //
  570. //--------------------------------------------------------------------------
  571. #ifdef _DEBUG
  572. dbgstream& dbgstream::operator<<(unsigned long ul)
  573. {
  574. // _ltoa - up to 33 bytes
  575. char szBuffer[35];
  576. if (m_fFrozen == FALSE)
  577. {
  578. _ultoa(ul, szBuffer, m_radix);
  579. return (operator<<(szBuffer));
  580. }
  581. return *this;
  582. }
  583. #endif // _DEBUG
  584. //+-------------------------------------------------------------------------
  585. //
  586. // Member: overloaded operator<<(const void *), public (_DEBUG only)
  587. //
  588. // Synopsis: put const void* into stream (store in character buffer)
  589. //
  590. // Effects: all pointers are inherently void*
  591. //
  592. // Arguments: [p] - void * to put in stream
  593. //
  594. // Requires: wsprintf
  595. //
  596. // Returns: reference to dbgstream (current object)
  597. //
  598. // Signals:
  599. //
  600. // Modifies:
  601. //
  602. // Derivation:
  603. //
  604. // Algorithm:
  605. //
  606. // History: dd-mmm-yy Author Comment
  607. // 11-Feb-95 t-ScottH author
  608. //
  609. // Notes:
  610. // wsprintf not most efficient, but easy for formatting
  611. //
  612. //--------------------------------------------------------------------------
  613. #ifdef _DEBUG
  614. dbgstream& dbgstream::operator<<(const void *p)
  615. {
  616. char szBuffer[15];
  617. int i;
  618. if (m_fFrozen == FALSE)
  619. {
  620. wsprintfA(szBuffer, "0x%08x", p);
  621. return (operator<<(szBuffer));
  622. }
  623. return *this;
  624. }
  625. #endif // _DEBUG
  626. //+-------------------------------------------------------------------------
  627. //
  628. // Member: overloaded operator<<(const char *), public (_DEBUG only)
  629. //
  630. // Synopsis: put const char* into stream (store in character buffer)
  631. //
  632. // Effects:
  633. //
  634. // Arguments: [psz] - const char * to put in stream
  635. //
  636. // Requires:
  637. //
  638. // Returns: reference to dbgstream (current object)
  639. //
  640. // Signals:
  641. //
  642. // Modifies:
  643. //
  644. // Derivation:
  645. //
  646. // Algorithm:
  647. //
  648. // History: dd-mmm-yy Author Comment
  649. // 11-Feb-95 t-ScottH author
  650. //
  651. // Notes:
  652. //
  653. //--------------------------------------------------------------------------
  654. #ifdef _DEBUG
  655. dbgstream& dbgstream::operator<<(const char *psz)
  656. {
  657. int i;
  658. // only if string is not frozen
  659. if (m_fFrozen == FALSE)
  660. {
  661. for (i = 0; psz[i] != '\0'; i++)
  662. {
  663. if ((m_stIndex + i) >= (m_stBufSize - 2))
  664. {
  665. // if reallocate fails m_fFrozen is TRUE
  666. reallocate();
  667. if (m_fFrozen == TRUE)
  668. {
  669. return *this;
  670. }
  671. }
  672. m_pszBuf[m_stIndex + i] = psz[i];
  673. }
  674. // ensure that always null terminated string
  675. m_pszBuf[m_stIndex + i] = '\0';
  676. m_stIndex += i;
  677. }
  678. return *this;
  679. }
  680. #endif // _DEBUG