⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 support.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -