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

📄 commlib.c

📁 好记星的控件,包括button,list,对文件操作
💻 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 + -