hxcrt.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:11k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxcrt.cpp,v 1.6.36.3 2004/07/09 01:45:19 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include <stdio.h>
  50. #include <string.h> // for memset
  51. #include "hxtypes.h"
  52. #ifndef _MAC_MACHO
  53. void* __nwa(size_t size, char* file, int line);
  54. //void* __nw(size_t size, char* file, int line);
  55. extern "C" void* __nwa__FUlPcl(size_t size, char*, int);
  56. //extern "C" void* __nw__FUlPcl(size_t size, char* file, int line);
  57. //extern "C" void* operator new(unsigned long, char*, long);
  58. #endif
  59. extern "C" short HXCRT_ASSERT(char* message);
  60. extern "C" {
  61. void* HXMM_NEWDEBUG(unsigned long size, char* file, unsigned long line);
  62. void* HXMM_NEW(unsigned long size);
  63. void HXMM_DELETE(void* ptr);
  64. void HXMM_INTERRUPTON(void);
  65. void HXMM_INTERRUPTOFF(void);
  66. BOOL HXMM_ATINTERRUPT(void);
  67. void HXMM_COMPACT(void);
  68. #ifndef _MAC_MACHO
  69. void* malloc(size_t size);
  70. void* calloc(size_t nmemb, size_t size);
  71. void* realloc(void* ptr, size_t size);
  72. void free(void* ptr);
  73. char *__ttyname(long);
  74. #endif
  75. }
  76. extern "C" short InstallConsole(short);
  77. extern "C" void RemoveConsole(void);
  78. extern "C" long WriteCharsToConsole(char*, long);
  79. extern "C" long ReadCharsFromConsole(char*, long);
  80. #ifndef _MAC_MACHO
  81. void* operator new(unsigned long size, char*, long);
  82. void* operator new(unsigned long size, char*, long)
  83. {
  84. return operator new(size);
  85. }
  86. //void* operator new[](size_t size, char* file, int line)
  87. void* __nwa(size_t size, char* file, int line)
  88. {
  89. void* retval = HXMM_NEWDEBUG(size, file, line);
  90. return retval;
  91. }
  92. void* __nw(size_t size, char* file, int line);
  93. void* __nw(size_t size, char* file, int line)
  94. {
  95. void* retval = HXMM_NEWDEBUG(size, file, line);
  96. return retval;
  97. }
  98. void* __nwa(size_t size)
  99. {
  100. void* retval = HXMM_NEW(size);
  101. return retval;
  102. }
  103. void* __nw(size_t size)
  104. {
  105. void* retval = HXMM_NEW(size);
  106. return retval;
  107. }
  108. void __dl(void* ptr)
  109. {
  110. HXMM_DELETE(ptr);
  111. }
  112. void __dla(void* ptr)
  113. {
  114. HXMM_DELETE(ptr);
  115. }
  116. void* __nwa__FUlPcl(size_t size, char*, int)
  117. {
  118. void* retval = HXMM_NEW(size);
  119. return retval;
  120. }
  121. #endif
  122. #pragma mark -
  123. CFBundleRef systemBundle = NULL;
  124. typedef void* (*MallocProcPtr) (size_t size);
  125. typedef void* (*ReallocProcPtr) (void* oldPtr, size_t size);
  126. typedef void* (*CallocProcPtr) (size_t nmemb, size_t size);
  127. typedef void* (*FreeProcPtr) (void* ptr);
  128. MallocProcPtr fpMalloc = NULL;
  129. ReallocProcPtr fpRealloc = NULL;
  130. CallocProcPtr fpCalloc = NULL;
  131. FreeProcPtr fpFree = NULL;
  132. static void LoadBundleIfNecessary()
  133. {
  134. if (!systemBundle)
  135. {
  136. systemBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.Carbon"));
  137. fpMalloc = (MallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("malloc"));
  138. fpRealloc = (ReallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("realloc"));
  139. fpCalloc = (CallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("calloc"));
  140. fpFree = (FreeProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("free"));
  141. }
  142. }
  143. #pragma mark -
  144. #define USE_NEW_POINTER_FOR_MALLOC 1
  145. #ifndef _MAC_MACHO
  146. void* malloc(size_t size)
  147. {
  148. LoadBundleIfNecessary();
  149. if (fpMalloc)
  150. {
  151. return fpMalloc(size);
  152. }
  153. HXCRT_ASSERT("malloc function pointer not found");
  154. return NULL;
  155. }
  156. void* calloc(size_t nmemb, size_t size)
  157. {
  158. if (fpCalloc)
  159. {
  160. return fpCalloc(nmemb, size);
  161. }
  162. HXCRT_ASSERT("calloc function pointer not found");
  163. return NULL;
  164. }
  165. void* realloc(void* ptr, size_t size)
  166. {
  167. if (fpRealloc)
  168. {
  169. return fpRealloc(ptr, size);
  170. }
  171. HXCRT_ASSERT("realloc function pointer not found");
  172. return NULL;
  173. }
  174. void free(void* ptr)
  175. {
  176. if (fpFree)
  177. {
  178. fpFree(ptr);
  179. return;
  180. }
  181. HXCRT_ASSERT("free function pointer not found");
  182. return;
  183. }
  184. #endif
  185. #pragma mark -
  186. short HXCRT_ASSERT(char* message)
  187. {
  188. printf("ASSERTION: %sn", message);
  189. return 0;
  190. }
  191. // Console stubs so stio.h stuff works
  192. #ifndef _MAC_MACHO
  193. short InstallConsole(short fd)
  194. {
  195. #pragma unused (fd)
  196. return 0;
  197. }
  198. /*
  199.  * extern void RemoveConsole(void);
  200.  *
  201.  * Removes the console package.  It is called after all other streams
  202.  * are closed and exit functions (installed by either atexit or _atexit)
  203.  * have been called.  Since there is no way to recover from an error,
  204.  * this function doesn't need to return any.
  205.  */
  206. void RemoveConsole(void)
  207. {
  208. }
  209. /*
  210.  * extern long WriteCharsToConsole(char *buffer, long n);
  211.  *
  212.  * Writes a stream of output to the Console window.  This function is
  213.  * called by write.
  214.  *
  215.  * char *buffer: Pointer to the buffer to be written.
  216.  * long n: The length of the buffer to be written.
  217.  * returns short: Actual number of characters written to the stream,
  218.  * -1 if an error occurred.
  219.  */
  220. long WriteCharsToConsole(char *buffer, long n)
  221. {
  222.     while (n > 0)
  223.     {
  224.     
  225.      // try to break the string on carriage returns
  226.      // (some consoles honor the r causing lines overwriting themselves)
  227. int lineLen = n;
  228. bool skipReturn = false;
  229.      for(int i=0;i<n;i++)
  230.      {
  231.      if (buffer[i] == 'r')
  232.      {
  233.      // found a CR -- print up to this point only 
  234.      lineLen = i;
  235.      skipReturn = true; // otherwise some consoles will print two CR's for a line
  236.      break;
  237.      }
  238.      }
  239.     
  240.      // and for sure break the line into blocks <= 200 bytes.
  241. Str255 a;
  242. long len = lineLen;
  243. if (len > 200) len = 200;
  244. a[0] = len;
  245. BlockMoveData(buffer, &a[1], len);
  246. DebugStr(a);
  247. if (skipReturn)
  248. len++;
  249. n -= len;
  250. buffer += len;
  251.     }
  252. return 0;
  253. }
  254. /*
  255.  * extern long ReadCharsFromConsole(char *buffer, long n);
  256.  *
  257.  * Reads from the Console into a buffer.  This function is called by
  258.  * read.
  259.  *
  260.  * char *buffer: Pointer to the buffer which will recieve the input.
  261.  * long n: The maximum amount of characters to be read (size of
  262.  * buffer).
  263.  * returns short: Actual number of characters read from the stream,
  264.  * -1 if an error occurred.
  265.  */
  266. long ReadCharsFromConsole(char *buffer, long n)
  267. {
  268. #pragma unused (buffer, n)
  269. return 0;
  270. }
  271. char *__ttyname(long)
  272. {
  273. return (NULL);
  274. }
  275. #endif
  276. void* HXMM_NEW(unsigned long size)
  277. {
  278. LoadBundleIfNecessary();
  279. if (fpMalloc)
  280. {
  281. return fpMalloc(size);
  282. }
  283. HXCRT_ASSERT("HXMM_NEW: malloc function pointer not found");
  284. return NULL;
  285. }
  286. void* HXMM_NEWDEBUG(unsigned long size, char* file, unsigned long line)
  287. {
  288.         return HXMM_NEW(size);
  289. }
  290. void HXMM_DELETE(void* ptr)
  291. {
  292. if (fpFree)
  293. {
  294. fpFree(ptr);
  295. return;
  296. }
  297. HXCRT_ASSERT("HXMM_DELETE: free function pointer not found");
  298. }
  299. #define kMaxInterruptEquivalentTaskIDs 20
  300. MPTaskID gInterruptEquivalentTaskIDs[kMaxInterruptEquivalentTaskIDs];
  301. long gCurrentInterruptEquivalentTaskID = 0;
  302. void HXMM_INTERRUPTON(void)
  303. {
  304. long whichTask;
  305. MPTaskID curID = MPCurrentTaskID();
  306. bool needToAdd = true;
  307. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  308. {
  309. if ( !gInterruptEquivalentTaskIDs[whichTask] )
  310. {
  311. needToAdd = false;
  312. gInterruptEquivalentTaskIDs[whichTask] = curID;
  313. break;
  314. }
  315. else if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  316. {
  317. needToAdd = false;
  318. }
  319. }
  320. if (needToAdd)
  321. {
  322. // HX_ASSERT(gCurrentInterruptEquivalentTaskID < kMaxInterruptEquivalentTaskIDs);
  323. if (gCurrentInterruptEquivalentTaskID < kMaxInterruptEquivalentTaskIDs)
  324. {
  325. gInterruptEquivalentTaskIDs[gCurrentInterruptEquivalentTaskID] = curID;
  326. gCurrentInterruptEquivalentTaskID++;
  327. }
  328. }
  329. }
  330. void HXMM_INTERRUPTOFF(void)
  331. {
  332. long whichTask;
  333. MPTaskID curID = MPCurrentTaskID();
  334. bool needToAdd = true;
  335. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  336. {
  337. if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  338. {
  339. // xxxbobclark if we knew for sure that HXMM_INTERRUPTON()
  340. // would only be called at actual interrupt time (and not
  341. // occasionally at system time) then we wouldn't need to do
  342. // this. But since it's sometimes incorrectly called at system
  343. // time, we don't want to hold an array that thinks that
  344. // system time is interrupt time. Also since the embedded
  345. // player has "system time" on different threads we can't
  346. // just watch for the bad case of HXMM_INTERRUPTON() at
  347. // system time...
  348. gInterruptEquivalentTaskIDs[whichTask] = 0; // so it doesn't match later
  349. }
  350. }
  351. }
  352. BOOL HXMM_ATINTERRUPT(void)
  353. {
  354. long whichTask;
  355. MPTaskID curID = MPCurrentTaskID();
  356. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  357. {
  358. if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  359. {
  360. return TRUE;
  361. }
  362. }
  363. return FALSE;
  364. }
  365. void HXMM_COMPACT(void)
  366. {
  367. // do nothing
  368. }