?? support.c
字號:
/****************************************************************************
*
* @module support.h
*
* @created 09-Februrary-2004
*
* @abstract Support functions for the MTP driver stack
*
* @copyright (C) COPYRIGHT Microsoft Corp, 2005
*
$Log: support.c,v $
Revision 1.6 2008/06/19 04:43:27 Administrator
代碼整理!
Revision 1.5 2008/06/11 03:59:54 HSL
修改 WCscat函數的 BUG.
Revision 1.4 2008/06/04 08:34:11 HSL
修改 WCscat 函數的 BUG.
Revision 1.3 2008/06/03 01:43:52 HSL
增加 WCscat 函數.
Revision 1.2 2008/05/20 07:44:49 HSL
根據PC仿真根改部分文件,增加部分WCHAR接口,根據狀態欄進行相應修改.
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:10 Lingzhaojun
no message
Revision 1.12 2008/01/07 12:52:19 Huangshilin
no message
Revision 1.11 2007/12/06 05:16:21 Huangshilin
增加 視頻靜態buffer和GUI 復用.修改窗口系統.
Revision 1.10 2007/11/28 01:48:42 Lingzhaojun
修復黃世林提交時產生的編譯錯誤
Revision 1.9 2007/11/27 14:01:35 Huangshilin
修改 音頻刷屏噪音,系統反應慢的 BUG.
Revision 1.7 2007/11/17 07:06:25 Lingzhaojun
狀態欄加入內存和處理器統計顯示
Revision 1.6 2007/11/13 14:41:18 Fangsaihong
去除無法播放和錯誤歌曲
Revision 1.5 2007/11/05 09:53:50 Huangshilin
增加GUI接口,增加應用資源互斥控制.
Revision 1.4 2007/10/30 10:28:15 Hanjiang
no message
Revision 1.3 2007/10/11 04:08:11 Huangshilin
System\os
Revision 1.2 2007/10/08 02:56:08 Lingzhaojun
添加版本自動注釋腳本
****************************************************************************/
#include "include.h"
#include "memo.h"
#if defined( BOARD )
#include "hw_api.h"
#endif
/*****************************************************************************/
/*
1. 為了保證給給外部提供的接口固定,把所有需要提供的系統接口集中到
一個文件,并統一命名,統一定位.
*/
/*****************************************************************************/
UINT32 HeapUsed = 0; //堆統計
static BOOLEAN HeapPrint = TRUE;
#define MaxHeapSpease 1024*1024*2
#define MEMO_DEBUG 0
/*****************************************************************************/
extern void* _gpAppHeapHandle;
/*****************************************************************************/
void PrintHeapUsed(void);
//////////////////////////////////////////////////////////////////////////////
char *RockStrDup(const char *__s)
{
char* dest;
size_t len = strlen(__s);
len++;
dest = MALLOC(len);
if (dest)
{
strcpy(dest, __s);
}
return (char*)dest;
}
int RockStriCmp(const char * s1, const char * s2)
{
int d ;
while (*s1 && *s2)
{
d = (*s1) - (*s2);
if (d != 0)
{
if (d != 'a' -'A' && d != 'A' -'a')
{
return d;
}
else if (*s1 < 'A' || *s1 > 'z' || (*s1 > 'Z' && *s1 < 'a'))
{
return d;
}
}
s1++;
s2++;
}
d = (*s1) - (*s2);
return d;
}
/*********************************************************************************
Name : WCstrlen
Desc : 取得 UNICODE 字符串的 長度,不包括 結束符0x0000.
Param :
str : UNICODE 字符串。
Return : 長度.
Global : 無.
Note :
Author : HUANGSL
Log :
*********************************************************************************/
INT32U WCstrlen(const WCHAR * str)
{
const WCHAR *s = str;
while (*s++);
return s -str - 1;
}
/*********************************************************************************
Name : WCstrcmp
Desc : 比較兩個 UNICODE 字符串是否相等.
Param :
s1 : UNICODE 字符串1。
s2 : UNICODE 字符串2。
Return : 0: 表示相等,非 0 表示不相等.
Global : 無.
Note :
Author : HUANGSL
Log :
*********************************************************************************/
INT32 WCstrcmp(const WCHAR* s1 , const WCHAR* s2)
{
INT32 r;
do
{
r = (INT32)(*s1++ - *s2++);
}
while (!r && *s1 && *s2);
return r;
}
WCHAR * WCscat(WCHAR* s1 , const WCHAR * s2)
{
//while( *s1++ ); //先 ++后比較,如果不 == 0 , 再++后比較.
while (*s1)
{
s1++;
}
while (*s2)
{
*s1++ = *s2++;
}
// ADD TERMINATE '\0'
*s1++ = 0;
return s1;
}
/*********************************************************************************
Name : WCstrdup
Desc : 復制一個 UNICODE 字符串.
Param :
s : 需要復制的UNICODE 字符串。
Return : 復制后的 UNICODE 字符串指針.NULL 表示失敗.
Global : 無.
Note : 返回指針為動態申請,外部必須負責釋放!!
Author : HUANGSL
Log :
*********************************************************************************/
WCHAR * WCstrdup(const WCHAR* s)
{
INT32 l = WCstrlen(s) + 1;
WCHAR *r ;
l *= sizeof(WCHAR);
r = (WCHAR*)MALLOC(l);
if (r)
{
memcpy(r , s , l);
}
return r;
}
/*----------------------------------------------------------------------
Name : RkMalloc
Desc : 說明:
1.由于底層系統部分調用以下函數,因此此文件不可改變!
2.2007-05-14,huangsl,由于很多指針判斷都已是否 ==NULL 為條件,因此
此處增加清0操作,以防止外部忘記給某些變量清0。
3.根據上面一條,保證申請的緩沖區已經為 0.
Params:
Return: 申請到的內存指針
Author: System Author
Date : 070830
----------------------------------------------------------------------*/
#if defined(_MSC_VER )
void* RkMalloc(size_t size)
#else
void* malloc(size_t size)
#endif
{
void * ptr;
DECLARE_CUP_SR;
ENTER_CRITICAL();
ptr = (void*)Malloc((void*) & _gpAppHeapHandle , size);
EXIT_CRITICAL();
if ((!ptr))
{
TR("Malloc ERROR,size=%d,ptr=0X%x", size, ptr);
return NULL;
}
HeapUsed = HeapUsed + *((unsigned int *)ptr - 1);//size;
#if ( MEMO_DEBUG > 0 )
//if(HeapPrint)
{
TR("Malloc OK,size=%d,ptr=0X%x", size, ptr);
PrintHeapUsed(); //lingzj add for 堆統計
}
#endif
//011120,考慮到 BUFFER可能 很大,MALLOC 很頻繁,因此不做 清除工作.
//有 應用自己根據需要清除.
//memset(ptr , 0 , size ); //請BUFFER。
return ptr;
}
/*----------------------------------------------------------------------
Name : RkFree
Desc : 釋放申請的動態內存
Params:
Return: 處理結果
Author: System Author
Date : 070830
----------------------------------------------------------------------*/
#if defined(_MSC_VER )
void RkFree(void *__ptr)
#else
void free(void *__ptr)
#endif
{
DECLARE_CUP_SR;
unsigned int *len = (unsigned int *)__ptr - 1;
if (MALLOC_NULL(__ptr))
{
#ifdef ARMULATE
TR("free ERROR,ptr=0X%x", __ptr);
#endif
return;
}
HeapUsed = HeapUsed - *len;
#if ( MEMO_DEBUG > 0 )
{
TR("Free OK,size=%d,ptr=0X%x", *len , __ptr);
PrintHeapUsed(); //lingzj add for 堆統計
}
#endif
ENTER_CRITICAL();
Free((void*)&_gpAppHeapHandle , __ptr);
EXIT_CRITICAL();
}
// 返回值中,TotalMemo =0 表示錯誤.
void RkGetMemoInfo(PMEMO_INFO pMemoInfo)
{
MemoGetSizeInfo(&_gpAppHeapHandle, pMemoInfo);
}
#ifndef SETUP
#if 0
void RkGetSysMemoInfo(PMEMO_INFO pMemoInfo)
{
MemoGetSizeInfo(&_gpSysHeapHandle, pMemoInfo);
}
#endif
/*----------------------------------------------------------------------
Name : PrintHeapUsed
Desc : 打印當前堆消耗情況,用于觀察各模塊是否有內存泄漏
以及統計一個模塊動態內存使用量等
Params:
Return: 無
Author: zhaojun
Date : 070830
----------------------------------------------------------------------*/
void PrintHeapUsed(void)
{
#if MEMO_DEBUG
if (HeapUsed >= MaxHeapSpease - 1000)
TR("!!!!!!! 堆空間告警 !!!!!!!!!!!!", "");
else
TR("當前堆空間總消耗 =0X%x", HeapUsed);
#endif
}
/************************************************************************************************
函數描述: 數值轉ASCII碼,用于文件夾或文件屬性顯示數值
入口參數: long n:要顯示的長整形數值
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -