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.

413 lines
7.1 KiB

  1. //+-------------------------------------------------------------------------
  2. // Microsoft Windows
  3. // Copyright (C) Microsoft Corporation, 1992 - 1993.
  4. //
  5. // File: stack.cpp
  6. //
  7. // Contents: Implementation of the TaskStack
  8. //
  9. // Classes:
  10. //
  11. // Functions:
  12. //
  13. // History: dd-mmm-yy Author Comment
  14. // 06-Feb-94 alexgo author
  15. //
  16. //--------------------------------------------------------------------------
  17. #include "oletest.h"
  18. //+-------------------------------------------------------------------------
  19. //
  20. // Member: TaskStack::TaskStack
  21. //
  22. // Synopsis: Constructor
  23. //
  24. // Arguments:
  25. //
  26. // Returns: void
  27. //
  28. // History: dd-mmm-yy Author Comment
  29. // 06-Feb-94 alexgo author
  30. //
  31. // Notes:
  32. //
  33. //--------------------------------------------------------------------------
  34. TaskStack::TaskStack( void )
  35. {
  36. m_pNodes = NULL;
  37. }
  38. //+-------------------------------------------------------------------------
  39. //
  40. // Member: TaskStack::AddToEnd
  41. //
  42. // Synopsis: adds a function and it's argument to the bottom of the stack
  43. //
  44. // Effects:
  45. //
  46. // Arguments: ti -- the task item to add to the end of the stack
  47. //
  48. // Requires:
  49. //
  50. // Returns: void
  51. //
  52. // Signals:
  53. //
  54. // Modifies:
  55. //
  56. // Derivation:
  57. //
  58. // Algorithm:
  59. //
  60. // History: dd-mmm-yy Author Comment
  61. // 06-Feb-94 alexgo author
  62. //
  63. // Notes: The task item is copied into the stack.
  64. //
  65. //--------------------------------------------------------------------------
  66. void TaskStack::AddToEnd( const TaskItem *pti )
  67. {
  68. TaskNode **ppNode;
  69. TaskNode *pNode = new TaskNode;
  70. assert(pNode);
  71. pNode->ti = *pti;
  72. pNode->pNext = NULL;
  73. for( ppNode = &m_pNodes; *ppNode != NULL;
  74. ppNode = &(*ppNode)->pNext)
  75. {
  76. ;
  77. }
  78. *ppNode = pNode;
  79. return;
  80. }
  81. //+-------------------------------------------------------------------------
  82. //
  83. // Member: TaskStack::AddToEnd
  84. //
  85. // Synopsis: adds a function and it's argument to the bottom of the stack
  86. //
  87. // Effects:
  88. //
  89. // Arguments: fnCall -- the function to call
  90. // pvArg -- the closure argument for the function
  91. //
  92. // Requires:
  93. //
  94. // Returns: void
  95. //
  96. // Signals:
  97. //
  98. // Modifies:
  99. //
  100. // Derivation:
  101. //
  102. // Algorithm:
  103. //
  104. // History: dd-mmm-yy Author Comment
  105. // 06-Feb-94 alexgo author
  106. //
  107. // Notes:
  108. //
  109. //--------------------------------------------------------------------------
  110. void TaskStack::AddToEnd( void (*fnCall)(void *), void *pvArg)
  111. {
  112. TaskItem ti = vzTaskItem; //clear it to zero
  113. ti.fnCall = fnCall;
  114. ti.pvArg = pvArg;
  115. AddToEnd(&ti);
  116. }
  117. //+-------------------------------------------------------------------------
  118. //
  119. // Member: TaskStack::Empty
  120. //
  121. // Synopsis: Empties the stack, ignoring the function call
  122. //
  123. // Effects:
  124. //
  125. // Arguments: void
  126. //
  127. // Requires:
  128. //
  129. // Returns: NULL
  130. //
  131. // Signals:
  132. //
  133. // Modifies:
  134. //
  135. // Derivation:
  136. //
  137. // Algorithm:
  138. //
  139. // History: dd-mmm-yy Author Comment
  140. // 06-Feb-94 alexgo author
  141. //
  142. // Notes:
  143. //
  144. //--------------------------------------------------------------------------
  145. void TaskStack::Empty( void )
  146. {
  147. while( m_pNodes )
  148. {
  149. Pop(NULL);
  150. }
  151. }
  152. //+-------------------------------------------------------------------------
  153. //
  154. // Member: TaskStack::IsEmpty
  155. //
  156. // Synopsis: returns TRUE if the stack is empty, false otherwise
  157. //
  158. // Effects:
  159. //
  160. // Arguments: void
  161. //
  162. // Requires:
  163. //
  164. // Returns: TRUE/FALSE
  165. //
  166. // Signals:
  167. //
  168. // Modifies:
  169. //
  170. // Derivation:
  171. //
  172. // Algorithm:
  173. //
  174. // History: dd-mmm-yy Author Comment
  175. // 06-Feb-94 alexgo author
  176. //
  177. // Notes:
  178. //
  179. //--------------------------------------------------------------------------
  180. BOOL TaskStack::IsEmpty(void)
  181. {
  182. if( m_pNodes )
  183. {
  184. return FALSE;
  185. }
  186. else
  187. {
  188. return TRUE;
  189. }
  190. }
  191. //+-------------------------------------------------------------------------
  192. //
  193. // Member: TaskStack::Pop
  194. //
  195. // Synopsis: Pops the stack, ignoring the function call
  196. //
  197. // Effects:
  198. //
  199. // Arguments: void
  200. //
  201. // Requires:
  202. //
  203. // Returns: the task item that was popped.
  204. //
  205. // Signals:
  206. //
  207. // Modifies:
  208. //
  209. // Derivation:
  210. //
  211. // Algorithm:
  212. //
  213. // History: dd-mmm-yy Author Comment
  214. // 06-Feb-94 alexgo author
  215. //
  216. // Notes:
  217. //
  218. //--------------------------------------------------------------------------
  219. void TaskStack::Pop( TaskItem *pti )
  220. {
  221. TaskNode *pTemp;
  222. if( m_pNodes )
  223. {
  224. if( pti )
  225. {
  226. *pti = m_pNodes->ti;
  227. }
  228. pTemp = m_pNodes;
  229. m_pNodes = m_pNodes->pNext;
  230. //now free the memory
  231. delete pTemp;
  232. }
  233. return;
  234. }
  235. //+-------------------------------------------------------------------------
  236. //
  237. // Member: TaskStack::PopAndExecute
  238. //
  239. // Synopsis: pops the stack and executes the function call
  240. //
  241. // Effects:
  242. //
  243. // Arguments: void
  244. //
  245. // Requires:
  246. //
  247. // Returns: the task item that was popped.
  248. //
  249. // Signals:
  250. //
  251. // Modifies:
  252. //
  253. // Derivation:
  254. //
  255. // Algorithm: Pop the stack and then execute the function call
  256. // in the just removed stack node.
  257. //
  258. // History: dd-mmm-yy Author Comment
  259. // 06-Feb-94 alexgo author
  260. // 09-Dec-94 MikeW Added exception handling
  261. //
  262. // Notes:
  263. //
  264. //--------------------------------------------------------------------------
  265. void TaskStack::PopAndExecute( TaskItem *pti )
  266. {
  267. TaskItem ti;
  268. if( pti == NULL )
  269. {
  270. pti = &ti;
  271. }
  272. Pop(pti);
  273. //if there's a function to execute, do it.
  274. //if the stack is empty, Pop will return a zero-filled TaskItem
  275. if( pti->fnCall )
  276. {
  277. if( pti->szName )
  278. {
  279. OutputString("Starting: %s\r\n", pti->szName);
  280. }
  281. //call the function
  282. __try
  283. {
  284. (*pti->fnCall)(pti->pvArg);
  285. }
  286. __except ((GetExceptionCode() == E_ABORT)
  287. ? EXCEPTION_EXECUTE_HANDLER
  288. : EXCEPTION_CONTINUE_SEARCH)
  289. {
  290. //
  291. // there was an assertion and the user hit abort
  292. //
  293. PostMessage(vApp.m_hwndMain, WM_TESTEND, TEST_FAILURE, 0);
  294. }
  295. }
  296. return;
  297. }
  298. //+-------------------------------------------------------------------------
  299. //
  300. // Member: TaskStack::Push
  301. //
  302. // Synopsis: pushes a function onto the stack
  303. //
  304. // Effects:
  305. //
  306. // Arguments: ti -- the task item to push onto the stack
  307. //
  308. // Requires:
  309. //
  310. // Returns: void
  311. //
  312. // Signals:
  313. //
  314. // Modifies:
  315. //
  316. // Derivation:
  317. //
  318. // Algorithm:
  319. //
  320. // History: dd-mmm-yy Author Comment
  321. // 06-Feb-94 alexgo author
  322. //
  323. // Notes:
  324. //
  325. //--------------------------------------------------------------------------
  326. void TaskStack::Push( const TaskItem *pti )
  327. {
  328. TaskNode *pNode = new TaskNode;
  329. assert(pNode);
  330. pNode->ti = *pti;
  331. pNode->pNext = m_pNodes;
  332. m_pNodes = pNode;
  333. return;
  334. }
  335. //+-------------------------------------------------------------------------
  336. //
  337. // Member: TaskStack::Push
  338. //
  339. // Synopsis: pushes a function onto the stack
  340. //
  341. // Effects:
  342. //
  343. // Arguments: fnCall -- the function to call
  344. // pvArg -- the closure argument for the function
  345. //
  346. // Requires:
  347. //
  348. // Returns: void
  349. //
  350. // Signals:
  351. //
  352. // Modifies:
  353. //
  354. // Derivation:
  355. //
  356. // Algorithm:
  357. //
  358. // History: dd-mmm-yy Author Comment
  359. // 06-Feb-94 alexgo author
  360. //
  361. // Notes:
  362. //
  363. //--------------------------------------------------------------------------
  364. void TaskStack::Push( void (*fnCall)(void *), void * pvArg)
  365. {
  366. TaskItem ti = vzTaskItem;
  367. ti.fnCall = fnCall;
  368. ti.pvArg = pvArg;
  369. Push(&ti);
  370. return;
  371. }