130 lines
3.7 KiB
C
130 lines
3.7 KiB
C
/***************************************************************************
|
|
* Copyright (c) 2014 Amlogic, Inc. All rights reserved.
|
|
*
|
|
* This source code is subject to the terms and conditions defined in the
|
|
* file 'LICENSE' which is part of this source code package.
|
|
*
|
|
* Description:
|
|
*/
|
|
/**\file
|
|
* \brief 一些常用宏和辅助函数
|
|
*
|
|
* \author Gong Ke <[email protected]>
|
|
* \date 2010-05-12: create the document
|
|
***************************************************************************/
|
|
|
|
#ifndef _AM_UTIL_H
|
|
#define _AM_UTIL_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Macro definitions
|
|
***************************************************************************/
|
|
|
|
/**\brief 函数inline属性*/
|
|
#define AM_INLINE inline
|
|
|
|
/**\brief 计算数值_a和_b中的最大值*/
|
|
#define AM_MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
|
|
|
|
/**\brief 计算数值_a和_b中的最小值*/
|
|
#define AM_MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
|
|
|
|
/**\brief 计算数值_a的绝对值*/
|
|
#define AM_ABS(_a) ((_a)>0?(_a):-(_a))
|
|
|
|
/**\brief 计算数值a与b差值的绝对值*/
|
|
#define AM_ABSSUB(a,b) ((a>=b)?(a-b):(b-a))
|
|
|
|
/**\brief 添加在命令行式宏定义的开头
|
|
* 一些宏需要完成一系列语句,为了使这些语句形成一个整体不被打断,需要用
|
|
* AM_MACRO_BEGIN和AM_MACRO_END将这些语句括起来。如:
|
|
* \code
|
|
* #define CHECK(_n) \
|
|
* AM_MACRO_BEGIN \
|
|
* if ((_n)>0) printf(">0"); \
|
|
* else if ((n)<0) printf("<0"); \
|
|
* else printf("=0"); \
|
|
* AM_MACRO_END
|
|
* \endcode
|
|
*/
|
|
#define AM_MACRO_BEGIN do {
|
|
|
|
/**\brief 添加在命令行式定义的末尾*/
|
|
#define AM_MACRO_END } while(0)
|
|
|
|
/**\brief 计算数组常数的元素数*/
|
|
#define AM_ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0]))
|
|
|
|
/**\brief 检查如果返回值是否错误,返回错误代码给调用函数*/
|
|
#define AM_TRY(_func) \
|
|
AM_MACRO_BEGIN\
|
|
int _ret;\
|
|
if ((_ret=(_func))!=0)\
|
|
return _ret;\
|
|
AM_MACRO_END
|
|
|
|
/**\brief 检查返回值是否错误,如果错误,跳转到final标号。注意:函数中必须定义"AM_ErrorCode_t ret"和标号"final"*/
|
|
#define AM_TRY_FINAL(_func)\
|
|
AM_MACRO_BEGIN\
|
|
if ((ret=(_func))!=0)\
|
|
goto final;\
|
|
AM_MACRO_END
|
|
|
|
/**\brief 开始解析一个被指定字符隔开的字符串*/
|
|
#define AM_TOKEN_PARSE_BEGIN(_str, _delim, _token) \
|
|
{\
|
|
char *_strb = strdup(_str);\
|
|
if (_strb) {\
|
|
_token = strtok(_strb, _delim);\
|
|
while (_token != NULL) {
|
|
|
|
#define AM_TOKEN_PARSE_END(_str, _delim, _token) \
|
|
_token = strtok(NULL, _delim);\
|
|
}\
|
|
free(_strb);\
|
|
}\
|
|
}
|
|
|
|
|
|
/**\brief 从一个被指定字符隔开的字符串中取指定位置的值,int类型,如未找到指定位置,则使用默认值_default代替*/
|
|
#define AM_TOKEN_VALUE_INT(_str, _delim, _index, _default) \
|
|
({\
|
|
char *token;\
|
|
char *_strbak = strdup(_str);\
|
|
int counter = 0;\
|
|
int val = _default;\
|
|
if (_strbak != NULL) {\
|
|
AM_TOKEN_PARSE_BEGIN(_strbak, _delim, token)\
|
|
if (counter == (_index)) {\
|
|
val = atoi(token);\
|
|
break;\
|
|
}\
|
|
counter++;\
|
|
AM_TOKEN_PARSE_END(_strbak, _delim, token)\
|
|
free(_strbak);\
|
|
}\
|
|
val;\
|
|
})
|
|
|
|
/****************************************************************************
|
|
* Type definitions
|
|
***************************************************************************/
|
|
|
|
|
|
/****************************************************************************
|
|
* Function prototypes
|
|
***************************************************************************/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|