#pragma once
#include "../acl_cpp_define.hpp"

namespace acl
{

/**
 * 获得上次系统调用出错时的错误号
 * @return {int} 错误号
 */
ACL_CPP_API int last_error(void);

/**
 * 手工设置错误号
 * @param errnum {int} 错误号
 */
ACL_CPP_API void set_error(int errnum);

/**
 * 获得上次系统调用出错时的错误描述信息，该函数内部采用了线程局部变量，所以是线程
 * 安全的，但使用起来更简单些
 * @return {const char *} 返回错误提示信息 
 */
ACL_CPP_API const char* last_serror(void);

/**
 * 获得上次系统调用出错时的错误描述信息
 * @param buf {char*} 存储错误描述信息的内存缓冲区
 * @param size {int} buffer 的空间大小
 * @return {const char*} 返回的地址应与 buffer 相同
 */
ACL_CPP_API const char* last_serror(char* buf, size_t size);

/**
 * 类似于标准C的 strerror, 但该函数是跨平台且是线程安全的，获得对应某个错误
 * 号的错误描述信息
 * @param errnum {int} 错误号
 * @param buf {char*} 存储错误描述信息的内存缓冲区
 * @param size {int} buffer 缓冲区的大小
 * @return {const char*} 返回的地址应与 buffer 相同
*/
ACL_CPP_API const char* string_error(int errnum, char* buf, size_t size);

ACL_CPP_API int strncasecmp_(const char *s1, const char *s2, size_t n);
ACL_CPP_API void assert_(bool n);
ACL_CPP_API void meter_time(const char *filename, int line, const char *info);
ACL_CPP_API long long get_curr_stamp(void);
ACL_CPP_API double stamp_sub(const struct timeval& from,
		const struct timeval& sub);

} // namespace acl
