/************************************************************************
 * AUTHOR: NiuJiuRu
 * FILENAME: swstring.h
 * DESCRIPTION: 字符串操作扩展函数
 * NOTE:
 * HISTORY:
 * 1, [2010-07-05] created by NiuJiuRu
 * 2, [2014-01-10] 修改"sw_str_getFieldName()"和"sw_str_getFieldValue()"
                   函数
 ***********************************************************************/
#ifndef __SWSTRING_H__
#define __SWSTRING_H__

#ifdef __cplusplus
extern "C"
{
#endif

/* 将所有字符转化成小写 */
char *xstrtolower(char *str);
	
/* 将所有字符转化成大写 */
char *xstrtoupper(char *str);

/* 在一个字符串内, 统计其包含某个给定字符的个数 */
int xstrcharcnt(const char *str, char c);

/* 在一个字符串内, 用一个给定的字符替换一个已存在的字符 */
int xstrcharreplace(char *str, char src, char dst);

/* 是否一个整数字符串 */
bool xstrisint(const char *str);

/* 是否一个十六进制字符串 */
bool xstrishex(const char *str);

/* 是否一个浮点字符串 */
bool xstrisfloat(const char *str);

/* 不区分大小写的比较字符串 */
int xstrcasecmp(const char *s1, const char *s2);

/* 不区分大小写的比较字符串的前n个字符 */
int xstrncasecmp(const char *s1, const char *s2, int n);

/* 不区分大小写的在一个字符串中查找子字符串 */
// mode: 1, "left" - 从字符串的开始位置向后查找; 2, "right" - 从字符串的结束位置向前查找
char *xstrcasestr(const char *str, const char *mode, const char *child);

/* 不区分大小写的在一个字符串中查找字符 */
// mode: 1, "left" - 从字符串的开始位置向后查找; 2, "right" - 从字符串的结束位置向前查找
char *xstrcasechr(const char *str, const char *mode, char c);

/* 获取系统当前的日期时间到字符串 */
// mode: 1, "datetime" - 日期和时间; 2, "datetime(h)" - 日期和时间(精确到毫秒); 3, "date" - 只有日期;
//       4, "time" - 只有时间; 5, "time(h)" - 只有时间(精确到毫秒)
char *xstrgettime(char *str, const char *mode);

/* 改变一个日期时间字符串(单位: 毫秒)的值 */
// mode: 1, "datetime" - 日期和时间; 2, "datetime(h)" - 日期和时间(精确到毫秒); 3, "date" - 只有日期;
//       4, "time" - 只有时间; 5, "time(h)" - 只有时间(精确到毫秒)
char *xstrtimegrow(char *str, const char *mode, int64_t ms);

/* 比较两个日期时间字符串, 并得到它们之间的差值(单位: 毫秒) */
// mode: 1, "datetime" - 日期和时间; 2, "datetime(h)" - 日期和时间(精确到毫秒); 3, "date" - 只有日期;
//       4, "time" - 只有时间; 5, "time(h)" - 只有时间(精确到毫秒)
bool xstrtimecmp(const char *s1, const char *s2, const char *mode, int64_t *interval);

/* 使用Unix时间戳字符串设置系统时间 */
int xsetlocaltime(const char *timestamp);

// Retrieves the number of milliseconds that have elapsed since the system was started
int xgettickcount(unsigned long *tick);

/* 不区分大小写的将一个十六进制字符串转换为它所对应的十六进制数据 */
// 1, 可自动处理"0x"/"0X"前缀、空格、逗号、'\t'、'\r'、'\n'等控制字符
int xstrtohex(const char *str, unsigned char *hex);

/* 从一个十六进制数据缓冲中构建出一个它所对应的十六进制字符串 */
// 1, 可自动添加"0x"/"0X"前缀、空格、逗号等分割符
int xstrfromhex(const unsigned char *hex, int hexCnt, char *str, const char *prefix, const char *split);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段值"设置它所对应的"字段名" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
bool sw_str_setFieldName(char *buf, int bufSize, char delimiter, const char *name, const char *value,
						 bool autoAdd, int *varySize);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段值"取得它所对应的"字段名" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
char *sw_str_getFieldName(const char *buf, int bufSize, char delimiter, char *name, int nameSize, const char *value);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段名"删除该"字段" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
bool sw_str_delFieldByName(char *buf, int bufSize, char delimiter, const char *name, int *varySize);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段名"设置它所对应的"字段值" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
bool sw_str_setFieldValue(char *buf, int bufSize, char delimiter, const char *name, const char *value,
						  bool autoAdd, int *varySize);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段名"取得它所对应的"字段值" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
char *sw_str_getFieldValue(const char *buf, int bufSize, char delimiter, const char *name, char *value, int valueSize);

/* 不区分大小写的在特定数据格式的Buffer中根据"字段值"删除该"字段" */
// 1, Buffer中数据的组成格式为: "n1 = v1"+"定界符"+"n2 = v2"+"定界符"+..."nn = vn"("="号的左边为"字段名",
//    右边为"字段值")
// 2, 可自动识别处理空格、'\t'、'\r'、'\n'等控制字符
bool sw_str_delFieldByValue(char *buf, int bufSize, char delimiter, const char *value, int *varySize);

#ifdef __cplusplus
}
#endif

#endif /* __SWSTRING_H__ */
