📄 commlib.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: CommLib.c */
/* MODULE NAME: 内核库 */
/* DESCRIPTION: 本文件主要定义编译没有定义的常用库函数 */
/* */
/* FUNCTIONS: */
/* stricmp 不区分大小写比较字符串的大小 */
/* strnicmp 不区分大小写按指定最大长度比较字符串的大小 */
/* memicmp 不区分大小按长度比较内存数据 */
/* Checksum 计算缓冲区数据的CHECKSUM */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-05-11 创建 */
/****************************************************************************/
// 包含必须的头文件
#include "Base.h"
#include "Kernel.h"
#include <ctype.h>
int MyIsAlpha(int a)
{
if ( (a >= 'a') && (a <= 'z') )
return TRUE;
if ( (a >= 'A') && (a <= 'Z') )
return TRUE;
return FALSE;
}
#ifdef USER_STR_EN // Base.h defined
int MyToUpper(int lo)
{
if ( (lo >= 'a') && (lo <= 'z') )
lo &= (~0x20);
return lo;
}
/****************************************************************************/
/* FUNCTION: INT stricmp( const CHAR *pStr1, const CHAR *pStr2) */
/* DESCRIPTION:不区分大小写比较字符串的大小 */
/* INPUTS: pStr1 - 要比较的字符串1的地址 */
/* pStr2 - 要比较的字符串2的地址 */
/* OUTPUTS: NONE */
/* RETURN: 第一个不同数据的差值,完全相同则返回0 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-07-03 创建 */
/****************************************************************************/
INT stricmp( const CHAR *pStr1, const CHAR *pStr2)
{
UINT i;
UINT8 byChar1, byChar2;
// 先判断空字串
if ( pStr1 == NULL )
{
if ( pStr2 == NULL )
return 0;
else
return (INT)-1;
}
if ( pStr2 == NULL )
return (INT)1;
for ( i = 0; ((pStr1[i] != 0) && (pStr2[i] != 0)); i++ )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
if ( MyIsAlpha(byChar1) && MyIsAlpha(byChar2) )
{
byChar1 = MyToUpper(byChar1);
byChar2 = MyToUpper(byChar2);
}
if ( byChar1 != byChar2 )
break;
else if ( byChar1 & 0x80 ) //对于全角字符,要比较第二个字节
{ //为什么不放在下一次循环?因为这是全角字符!!(可能第二个字节是a-z)
byChar1 = pStr1[i+1];
byChar2 = pStr2[i+1];
i += 1;
if ( byChar1 != byChar2 )
break;
}
}
//if ( i == 0 )
if ( (pStr1[i] != 0) || (pStr2[i] != 0) )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
if ( MyIsAlpha(byChar1) && MyIsAlpha(byChar2) )
{
byChar1 = MyToUpper(byChar1);
byChar2 = MyToUpper(byChar2);
}
}
return ((INT)byChar1 - (INT)byChar2);
}
/****************************************************************************/
/* FUNCTION: INT strnicmp( const CHAR *pStr1, const CHAR *pStr2, */
/* UINT uLen ) */
/* DESCRIPTION:不区分大小写按指定最大长度比较字符串的大小 */
/* INPUTS: pStr1 - 要比较的字符串1的地址 */
/* pStr2 - 要比较的字符串2的地址 */
/* uLen - 要比较的最大长度 */
/* OUTPUTS: NONE */
/* RETURN: 第一个不同数据的差值,完全相同则返回0 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-07-03 创建 */
/****************************************************************************/
INT strnicmp( const CHAR *pStr1, const CHAR *pStr2, UINT uLen )
{
UINT i;
UINT8 byChar1, byChar2;
// 先判断空字串
if ( pStr1 == NULL )
{
if ( pStr2 == NULL )
return 0;
else
return (INT)-1;
}
if ( pStr2 == NULL )
return (INT)1;
for ( i = 0; ((pStr1[i] != 0) && (pStr2[i] != 0) && (i < uLen)); i++ )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
if ( MyIsAlpha(byChar1) && MyIsAlpha(byChar2) )
{
byChar1 = MyToUpper(byChar1);
byChar2 = MyToUpper(byChar2);
}
if ( byChar1 != byChar2 )
break;
else if ( byChar1 & 0x80 ) //对于全角字符,要比较第二个字节
{ //为什么不放在下一次循环?因为这是全角字符!!(可能第二个字节是a-z)
byChar1 = pStr1[i+1];
byChar2 = pStr2[i+1];
i += 1;
if ( byChar1 != byChar2 )
break;
}
}
//if ( i == 0 )
if ( (i < uLen) && ((pStr1[i] != 0) || (pStr2[i] != 0)) )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
if ( MyIsAlpha(byChar1) && MyIsAlpha(byChar2) )
{
byChar1 = MyToUpper(byChar1);
byChar2 = MyToUpper(byChar2);
}
}
return ((INT)byChar1 - (INT)byChar2);
}
/****************************************************************************/
/* FUNCTION: INT memicmp( const VOID *pBuffer1, const VOID *pBuffer2, */
/* UINT uLen ) */
/* DESCRIPTION:不区分大小按长度比较内存数据 */
/* INPUTS: pBuffer1 - 要比较的内存数据1的地址 */
/* pBuffer2 - 要比较的内存数据2的地址 */
/* uLen - 要比较的最大长度 */
/* OUTPUTS: NONE */
/* RETURN: 第一个不同数据的差值,完全相同则返回0 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-07-03 创建 */
/****************************************************************************/
INT memicmp( const VOID *pBuffer1, const VOID *pBuffer2, UINT uLen )
{
UINT i;
UINT8 *pStr1, *pStr2;
UINT8 byChar1, byChar2;
// 先判断空字串
if ( pBuffer1 == NULL )
{
if ( pBuffer2 == NULL )
return 0;
else
return (INT)-1;
}
if ( pBuffer2 == NULL )
return (INT)1;
pStr1 = (UINT8*)pBuffer1;
pStr2 = (UINT8*)pBuffer2;
for ( i = 0; i < uLen; i++ )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
if ( MyIsAlpha(byChar1) && MyIsAlpha(byChar2) )
{
byChar1 = MyToUpper(byChar1);
byChar2 = MyToUpper(byChar2);
}
if ( byChar1 != byChar2 )
break;
else if ( byChar1 & 0x80 ) //对于全角字符,要比较第二个字节
{ //为什么不放在下一次循环?因为这是全角字符!!(可能第二个字节是a-z)
if ( i < uLen )
{
byChar1 = pStr1[i+1];
byChar2 = pStr2[i+1];
i += 1;
if ( byChar1 != byChar2 )
break;
}
else
break;
}
}
//if ( i == 0 )
if ( i < uLen )
{
byChar1 = pStr1[i];
byChar2 = pStr2[i];
}
return ((INT)byChar1 - (INT)byChar2);
}
#endif
#if 0
/****************************************************************************/
/* FUNCTION: UINT16 Checksum( const VOID *pBuffer, UINT uLen ) */
/* DESCRIPTION:计算缓冲区数据的CHECKSUM */
/* INPUTS: pBuffer - 要计算的数据的缓冲区地址 */
/* uLen - 要计算的数据的长度 */
/* OUTPUTS: NONE */
/* RETURN: 返回计算得到的CHECKSUM */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-07-03 创建 */
/****************************************************************************/
UINT16 Checksum( const VOID *pBuffer, UINT uLen )
{
UINT32 dwSum;
UINT8 *pStr;
dwSum = 0;
pStr = (UINT8*)pBuffer;
while ( uLen-- > 0 )
dwSum += *pStr++;
return dwSum;
}
#endif
/*************************************************************************
Function : DotInArea
Description: is the point in specified area
Input:
x, y - the start x, y
width, height
Return:
TRUE, if point in specified area; otherwise, FALSE;
DATE AUTHOR VERSION REMARKS
2005-1-5 gaolinhui v1.00
==========================================================================
**************************************************************************/
BOOL DotInArea(INT px, INT py, INT x, INT y, INT width, INT height)
{ //包括边界点
if(px < x) return FALSE;
if(py < y) return FALSE;
if(px > (x+width-1)) return FALSE;
if(py > (y+height-1)) return FALSE;
return TRUE;
}
/****************************************************************************/
/* FUNCTION: BOOL MsgPost(APGUI_STRUCT_MODEL* pGui,UINT uEvent, UINT uParam)*/
/* DESCRIPTION:向消息队列post一个message */
/* INPUTS: pGui - 窗口或控件的句柄 */
/* uEvent - 消息类型 */
/* uParam - 消息参数 */
/* OUTPUTS: */
/* RETURN: 消息post是否成功 */
/* notes: 由于系统的消息结构没有窗口句柄成员,因此消息只能发送给最上 */
/* 面的窗口,但是还保留窗口句柄的接口 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* gaolinhui 2006-01-06 创建 */
/****************************************************************************/
extern NU_QUEUE g_quEventQueue;
BOOL MsgPost(APGUI_STRUCT_MODEL* pGui,UINT uEvent, UINT uParam)
{
UINT nArrEvent[2];
if(uEvent == EVENT_NOTHING)
return FALSE;
nArrEvent[0] = uEvent;
nArrEvent[1] = uParam;
if(NU_Send_To_Queue(&g_quEventQueue,nArrEvent,EVENT_SIZE,NU_NO_SUSPEND) != NU_SUCCESS)
return FALSE;
return TRUE;
}
/****************************************************************************/
/* FUNCTION: INT MsgSend2(APGUI_STRUCT_MODEL* pGui,UINT uEvent, UINT uParam)*/
/* DESCRIPTION:向消息队列post一个message */
/* INPUTS: pGui - 窗口或控件的句柄 */
/* uEvent - 消息类型 */
/* uParam - 消息参数 */
/* OUTPUTS: */
/* RETURN: 消息处理后的返回值 */
/* notes: 1.如果pGui == null,消息依次发送给最上面的窗口及其控件,直到 */
/* 处理了该消息返回 */
/* 2.如果pGui != NULL, 消息将直接发送pGui指向的控件或窗口 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* gaolinhui 2006-01-09 创建 */
/****************************************************************************/
INT MsgSend2(APGUI_STRUCT_MODEL* pGui,UINT uEvent, UINT uParam)
{
INT nRet;
nRet = 0;
if( (uEvent != EVENT_NOTHING) && (pGui != NULL) )
nRet = pGui->fpHandleFunc(pGui, uEvent, uParam);
return nRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -