Kaynağa Gözat

添加c接口文档

ithewei 2 yıl önce
ebeveyn
işleme
43eb47e797
3 değiştirilmiş dosya ile 224 ekleme ve 0 silme
  1. 2 0
      docs/cn/README.md
  2. 111 0
      docs/cn/hbase.md
  3. 111 0
      docs/cn/hlog.md

+ 2 - 0
docs/cn/README.md

@@ -1,6 +1,8 @@
 ## c接口
 
 - [hloop: 事件循环](hloop.md)
+- [hbase: 基础函数](hbase.md)
+- [hlog:  日志](hlog.md)
 
 ## c++接口
 

+ 111 - 0
docs/cn/hbase.md

@@ -0,0 +1,111 @@
+一些基础函数
+
+```c
+
+/* hv内存分配/释放函数 */
+void* hv_malloc(size_t size);
+void* hv_realloc(void* oldptr, size_t newsize, size_t oldsize);
+void* hv_calloc(size_t nmemb, size_t size);
+void* hv_zalloc(size_t size);
+void  hv_free(void* ptr);
+
+// 使用hv分配内存次数
+long hv_alloc_cnt();
+
+// 使用hv释放内存次数
+long hv_free_cnt();
+
+/* 字符串操作 */
+// 字符串转大写
+char* hv_strupper(char* str);
+// 字符串转小写
+char* hv_strlower(char* str);
+// 字符串翻转
+char* hv_strreverse(char* str);
+
+// 判断字符串是否以xxx开头
+bool hv_strstartswith(const char* str, const char* start);
+
+// 判断字符串是否以xxx结尾
+bool hv_strendswith(const char* str, const char* end);
+
+// 判断字符串是否包含xxx
+bool hv_strcontains(const char* str, const char* sub);
+
+// 安全的strncpy
+char* hv_strncpy(char* dest, const char* src, size_t n);
+
+// 安全的strncat
+char* hv_strncat(char* dest, const char* src, size_t n);
+
+// 字符查找
+char* hv_strnchr(const char* s, char c, size_t n);
+
+// 查找最后一个点(通常用于提取文件后缀)
+#define hv_strrchr_dot(str) strrchr(str, '.')
+
+// 查找最后的路径(通常用于分离目录和文件)
+char* hv_strrchr_dir(const char* filepath);
+
+// 获取文件名(利用了上面的strrchr_dir)
+const char* hv_basename(const char* filepath);
+
+// 获取文件后缀(利用了上面的strrchr_dot)
+const char* hv_suffixname(const char* filename);
+
+/* 文件&目录 */
+// mkdir -p: 创建目录
+int hv_mkdir_p(const char* dir);
+// rmdir -p: 删除目录
+int hv_rmdir_p(const char* dir);
+
+// 判断路径是否存在
+bool hv_exists(const char* path);
+
+// 判断是否是目录
+bool hv_isdir(const char* path);
+
+// 判断是否是文件
+bool hv_isfile(const char* path);
+
+// 判断是否是链接
+bool hv_islink(const char* path);
+
+// 获取文件大小
+size_t hv_filesize(const char* filepath);
+
+// 获取可执行文件绝对路径,例如/usr/local/bin/httpd
+char* get_executable_path(char* buf, int size);
+
+// 获取可执行文件所在目录,例如/usr/local/bin
+char* get_executable_dir(char* buf, int size);
+
+// 获取可执行文件名,例如httpd
+char* get_executable_file(char* buf, int size);
+
+// 获取运行目录,例如/home/www/html
+char* get_run_dir(char* buf, int size);
+
+// 返回一个随机数
+int   hv_rand(int min, int max);
+
+// 返回一个随机字符串
+char* hv_random_string(char *buf, int len);
+
+// 1 y on yes true enable返回true(通常用于配置文件)
+bool   hv_getboolean(const char* str);
+
+// 解析size字符串
+// 1T2G3M4K5B => ?B
+size_t hv_parse_size(const char* str);
+
+// 解析时间字符串
+// 1w2d3h4m5s => ?s
+time_t hv_parse_time(const char* str);
+
+// 解析url字符串
+int hv_parse_url(hurl_t* stURL, const char* strURL);
+
+```
+
+单元测试代码见 [unittest/hbase_test.c](../../unittest/hbase_test.c)

+ 111 - 0
docs/cn/hlog.md

@@ -0,0 +1,111 @@
+日志
+
+```c
+
+// 标准输出日志
+void stdout_logger(int loglevel, const char* buf, int len);
+
+// 标准错误日志
+void stderr_logger(int loglevel, const char* buf, int len);
+
+// 文件日志
+void file_logger(int loglevel, const char* buf, int len);
+
+// 网络日志(定义在event/nlog.h头文件里)
+// void network_logger(int loglevel, const char* buf, int len);
+
+// 创建日志器
+logger_t* logger_create();
+
+// 销毁日志器
+void logger_destroy(logger_t* logger);
+
+// 设置日志处理器
+void logger_set_handler(logger_t* logger, logger_handler fn);
+
+// 设置日志等级
+void logger_set_level(logger_t* logger, int level);
+// level = [VERBOSE,DEBUG,INFO,WARN,ERROR,FATAL,SILENT]
+void logger_set_level_by_str(logger_t* logger, const char* level);
+
+/*
+ * 设置日志格式
+ * format  = "%y-%m-%d %H:%M:%S.%z %L %s"
+ * message = "2020-01-02 03:04:05.067 DEBUG message"
+ * %y year
+ * %m month
+ * %d day
+ * %H hour
+ * %M min
+ * %S sec
+ * %z ms
+ * %Z us
+ * %l First character of level
+ * %L All characters of level
+ * %s message
+ * %% %
+ */
+void logger_set_format(logger_t* logger, const char* format);
+
+// 设置日志缓存大小
+void logger_set_max_bufsize(logger_t* logger, unsigned int bufsize);
+
+// 启用日志颜色
+void logger_enable_color(logger_t* logger, int on);
+
+// 日志打印
+int  logger_print(logger_t* logger, int level, const char* fmt, ...);
+
+// 设置日志文件
+void logger_set_file(logger_t* logger, const char* filepath);
+
+// 设置日志文件大小
+void logger_set_max_filesize(logger_t* logger, unsigned long long filesize);
+// 16, 16M, 16MB
+void logger_set_max_filesize_by_str(logger_t* logger, const char* filesize);
+
+// 设置日志文件保留天数
+void logger_set_remain_days(logger_t* logger, int days);
+
+// 启用每次写日志文件立即刷新到磁盘(即每次都调用fsync,会增加IO耗时,影响性能)
+void logger_enable_fsync(logger_t* logger, int on);
+
+// 刷新缓存到磁盘(如对日志文件实时性有必要的,可使用定时器定时刷新到磁盘)
+void logger_fsync(logger_t* logger);
+
+// 获取当前日志文件路径
+const char* logger_get_cur_file(logger_t* logger);
+
+// hlog: 默认的日志器
+logger_t* hv_default_logger();
+
+// 销毁默认的日志器
+void      hv_destroy_default_logger(void);
+
+// 对默认日志器hlog的一些便利操作宏
+#define hlog                            hv_default_logger()
+#define hlog_destory()                  hv_destroy_default_logger()
+/* 禁用hv的默认日志 */
+#define hlog_disable()                  logger_set_level(hlog, LOG_LEVEL_SILENT)
+#define hlog_set_file(filepath)         logger_set_file(hlog, filepath)
+#define hlog_set_level(level)           logger_set_level(hlog, level)
+#define hlog_set_level_by_str(level)    logger_set_level_by_str(hlog, level)
+#define hlog_set_handler(fn)            logger_set_handler(hlog, fn)
+#define hlog_set_format(format)         logger_set_format(hlog, format)
+#define hlog_set_max_filesize(filesize) logger_set_max_filesize(hlog, filesize)
+#define hlog_set_max_filesize_by_str(filesize) logger_set_max_filesize_by_str(hlog, filesize)
+#define hlog_set_remain_days(days)      logger_set_remain_days(hlog, days)
+#define hlog_enable_fsync()             logger_enable_fsync(hlog, 1)
+#define hlog_disable_fsync()            logger_enable_fsync(hlog, 0)
+#define hlog_fsync()                    logger_fsync(hlog)
+#define hlog_get_cur_file()             logger_get_cur_file(hlog)
+
+#define hlogd(fmt, ...) logger_print(hlog, LOG_LEVEL_DEBUG, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILENAME__, __LINE__, __FUNCTION__)
+#define hlogi(fmt, ...) logger_print(hlog, LOG_LEVEL_INFO,  fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILENAME__, __LINE__, __FUNCTION__)
+#define hlogw(fmt, ...) logger_print(hlog, LOG_LEVEL_WARN,  fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILENAME__, __LINE__, __FUNCTION__)
+#define hloge(fmt, ...) logger_print(hlog, LOG_LEVEL_ERROR, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILENAME__, __LINE__, __FUNCTION__)
+#define hlogf(fmt, ...) logger_print(hlog, LOG_LEVEL_FATAL, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILENAME__, __LINE__, __FUNCTION__)
+
+```
+
+测试代码见 [examples/hloop_test.c](../../examples/hloop_test.c)