Windows NT 4.0 source code leak
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.

186 lines
3.1 KiB

4 years ago
  1. /**********************************************************************/
  2. /** Microsoft LAN Manager **/
  3. /** Copyright(c) Microsoft Corp., 1987-1990 **/
  4. /**********************************************************************/
  5. /*
  6. buffer.hxx
  7. MIDL Compiler Buffer Manager Definition
  8. This class manages two-way infinite buffer of string pointers.
  9. */
  10. /*
  11. FILE HISTORY :
  12. DonnaLi 09-11-1990 Created.
  13. */
  14. #ifndef __BUFFER_HXX__
  15. #define __BUFFER_HXX__
  16. #include "stream.hxx"
  17. #include <assert.h>
  18. class BufferElement
  19. {
  20. public:
  21. BufferElement * pPrev;
  22. BufferElement * pNext;
  23. char ** pBuffer;
  24. BufferElement(
  25. BufferElement * pPrevElem,
  26. BufferElement * pNextElem,
  27. char ** pNewBuf)
  28. {
  29. pPrev = pPrevElem;
  30. pNext = pNextElem;
  31. pBuffer = pNewBuf;
  32. }
  33. ~BufferElement()
  34. {
  35. delete pBuffer;
  36. }
  37. BufferElement * ExtendPrev(char ** pNewBuf)
  38. {
  39. if (pPrev)
  40. {
  41. return pPrev;
  42. }
  43. else
  44. {
  45. return pPrev = new BufferElement(NULL, this, pNewBuf);
  46. }
  47. }
  48. BufferElement * ExtendNext(char ** pNewBuf)
  49. {
  50. if (pNext)
  51. {
  52. return pNext;
  53. }
  54. else
  55. {
  56. return pNext = new BufferElement(this, NULL, pNewBuf);
  57. }
  58. }
  59. BufferElement * GetPrev()
  60. {
  61. return pPrev;
  62. }
  63. BufferElement * GetNext()
  64. {
  65. return pNext;
  66. }
  67. };
  68. class BufferManager
  69. {
  70. char ** pszTable;
  71. unsigned short usTabSize;
  72. unsigned short usBufSize;
  73. BufferElement * pSave;
  74. BufferElement * pHead;
  75. BufferElement * pTail;
  76. unsigned short iHead;
  77. unsigned short iTail;
  78. public:
  79. BufferManager(unsigned short);
  80. BufferManager(unsigned short, unsigned short, const char * []);
  81. ~BufferManager()
  82. {
  83. BufferElement * pCur = pHead;
  84. BufferElement * pNext;
  85. while ( pCur )
  86. {
  87. pNext = pCur->pNext;
  88. delete pCur;
  89. pCur = pNext;
  90. }
  91. }
  92. void Clear()
  93. {
  94. if ( pHead != pTail )
  95. {
  96. BufferElement * pCur = pHead;
  97. BufferElement * pNext;
  98. while ( pCur )
  99. {
  100. pNext = pCur->pNext;
  101. if ( pCur != pSave )
  102. delete pCur;
  103. pCur = pNext;
  104. }
  105. }
  106. pHead = pTail = pSave;
  107. pSave->pNext = NULL;
  108. pSave->pPrev = NULL;
  109. iHead = iTail = usBufSize - 2;
  110. }
  111. void Print(ISTREAM *);
  112. void ConcatHead(char * psz)
  113. {
  114. BufferElement * pTemp;
  115. if (iHead == 0)
  116. {
  117. pTemp = pHead->ExtendPrev(new (char *[usBufSize]));
  118. iHead = usBufSize-1;
  119. pHead = pTemp;
  120. pHead->pBuffer[iHead] = psz;
  121. }
  122. else
  123. {
  124. pHead->pBuffer[--iHead] = psz;
  125. }
  126. }
  127. void ConcatHead(unsigned short iIndex)
  128. {
  129. assert( iIndex < usTabSize );
  130. ConcatHead( pszTable[iIndex] );
  131. }
  132. void ConcatTail(char * psz)
  133. {
  134. BufferElement * pTemp;
  135. if (iTail == usBufSize)
  136. {
  137. pTemp = pTail->ExtendNext(new (char *[usBufSize]));
  138. iTail = 0;
  139. pTail = pTemp;
  140. pTail->pBuffer[iTail++] = psz;
  141. }
  142. else
  143. {
  144. pTail->pBuffer[iTail++] = psz;
  145. }
  146. }
  147. void ConcatTail(unsigned short iIndex)
  148. {
  149. assert( iIndex < usTabSize );
  150. ConcatTail( pszTable[iIndex] );
  151. }
  152. };
  153. #endif // __BUFFER_HXX__