Leaked source code of windows server 2003
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.

771 lines
15 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. const int cch = sizeof(szBuffer) / sizeof(szBuffer[0]);
  495. if (m_fFrozen == FALSE)
  496. {
  497. switch(m_radix)
  498. {
  499. case 16: _snprintf(szBuffer, cch, "%x", i); break;
  500. case 8: _snprintf(szBuffer, cch, "%o", i); break;
  501. default: _snprintf(szBuffer, cch, "%d", i); break;
  502. }
  503. szBuffer[cch - 1] = '\0';
  504. return (operator<<(szBuffer));
  505. }
  506. return *this;
  507. }
  508. #endif // _DEBUG
  509. //+-------------------------------------------------------------------------
  510. //
  511. // Member: overloaded operator<<(long), public (_DEBUG only)
  512. //
  513. // Synopsis: put long into stream (store in character buffer)
  514. //
  515. // Effects:
  516. //
  517. // Arguments: [l] - long to put in stream
  518. //
  519. // Requires: _ltoa
  520. //
  521. // Returns: reference to dbgstream (current object)
  522. //
  523. // Signals:
  524. //
  525. // Modifies:
  526. //
  527. // Derivation:
  528. //
  529. // Algorithm:
  530. //
  531. // History: dd-mmm-yy Author Comment
  532. // 11-Feb-95 t-ScottH author
  533. //
  534. // Notes:
  535. //
  536. //--------------------------------------------------------------------------
  537. #ifdef _DEBUG
  538. dbgstream& dbgstream::operator<<(long l)
  539. {
  540. // _ltoa - up to 33 bytes
  541. char szBuffer[35];
  542. if (m_fFrozen == FALSE)
  543. {
  544. _ltoa(l, szBuffer, m_radix);
  545. return (operator<<(szBuffer));
  546. }
  547. return *this;
  548. }
  549. #endif // _DEBUG
  550. //+-------------------------------------------------------------------------
  551. //
  552. // Member: overloaded operator<<(unsigned long), public (_DEBUG only)
  553. //
  554. // Synopsis: put unsigned long into stream (store in character buffer)
  555. //
  556. // Effects:
  557. //
  558. // Arguments: [ul] - long to put in stream
  559. //
  560. // Requires: _ultoa
  561. //
  562. // Returns: reference to dbgstream (current object)
  563. //
  564. // Signals:
  565. //
  566. // Modifies:
  567. //
  568. // Derivation:
  569. //
  570. // Algorithm:
  571. //
  572. // History: dd-mmm-yy Author Comment
  573. // 11-Feb-95 t-ScottH author
  574. //
  575. // Notes:
  576. //
  577. //--------------------------------------------------------------------------
  578. #ifdef _DEBUG
  579. dbgstream& dbgstream::operator<<(unsigned long ul)
  580. {
  581. // _ltoa - up to 33 bytes
  582. char szBuffer[35];
  583. if (m_fFrozen == FALSE)
  584. {
  585. _ultoa(ul, szBuffer, m_radix);
  586. return (operator<<(szBuffer));
  587. }
  588. return *this;
  589. }
  590. #endif // _DEBUG
  591. //+-------------------------------------------------------------------------
  592. //
  593. // Member: overloaded operator<<(const void *), public (_DEBUG only)
  594. //
  595. // Synopsis: put const void* into stream (store in character buffer)
  596. //
  597. // Effects: all pointers are inherently void*
  598. //
  599. // Arguments: [p] - void * to put in stream
  600. //
  601. // Requires: wsprintf
  602. //
  603. // Returns: reference to dbgstream (current object)
  604. //
  605. // Signals:
  606. //
  607. // Modifies:
  608. //
  609. // Derivation:
  610. //
  611. // Algorithm:
  612. //
  613. // History: dd-mmm-yy Author Comment
  614. // 11-Feb-95 t-ScottH author
  615. //
  616. // Notes:
  617. // wsprintf not most efficient, but easy for formatting
  618. //
  619. //--------------------------------------------------------------------------
  620. #ifdef _DEBUG
  621. dbgstream& dbgstream::operator<<(const void *p)
  622. {
  623. char szBuffer[19];
  624. const int cch = (sizeof(szBuffer) / sizeof(szBuffer[0])) - 1;
  625. if (m_fFrozen == FALSE)
  626. {
  627. _snprintf(szBuffer, cch, "0x%p", p);
  628. szBuffer[cch-1] = '\0';
  629. return (operator<<(szBuffer));
  630. }
  631. return *this;
  632. }
  633. #endif // _DEBUG
  634. //+-------------------------------------------------------------------------
  635. //
  636. // Member: overloaded operator<<(const char *), public (_DEBUG only)
  637. //
  638. // Synopsis: put const char* into stream (store in character buffer)
  639. //
  640. // Effects:
  641. //
  642. // Arguments: [psz] - const char * to put in stream
  643. //
  644. // Requires:
  645. //
  646. // Returns: reference to dbgstream (current object)
  647. //
  648. // Signals:
  649. //
  650. // Modifies:
  651. //
  652. // Derivation:
  653. //
  654. // Algorithm:
  655. //
  656. // History: dd-mmm-yy Author Comment
  657. // 11-Feb-95 t-ScottH author
  658. //
  659. // Notes:
  660. //
  661. //--------------------------------------------------------------------------
  662. #ifdef _DEBUG
  663. dbgstream& dbgstream::operator<<(const char *psz)
  664. {
  665. int i;
  666. // only if string is not frozen
  667. if (m_fFrozen == FALSE)
  668. {
  669. for (i = 0; psz[i] != '\0'; i++)
  670. {
  671. if ((m_stIndex + i) >= (m_stBufSize - 2))
  672. {
  673. // if reallocate fails m_fFrozen is TRUE
  674. reallocate();
  675. if (m_fFrozen == TRUE)
  676. {
  677. return *this;
  678. }
  679. }
  680. m_pszBuf[m_stIndex + i] = psz[i];
  681. }
  682. // ensure that always null terminated string
  683. m_pszBuf[m_stIndex + i] = '\0';
  684. m_stIndex += i;
  685. }
  686. return *this;
  687. }
  688. #endif // _DEBUG