From 38c8e4f6e41db1c5aba3dd5c238a3da4a4915a7d Mon Sep 17 00:00:00 2001 From: ypc <15051963820@163.com> Date: Tue, 7 Jul 2026 13:53:13 +0800 Subject: [PATCH] =?UTF-8?q?[myFunc.c]=20=E8=A1=A5=E5=85=A8=2056=20?= =?UTF-8?q?=E4=B8=AA=E5=87=BD=E6=95=B0=20@brief=20=E6=B3=A8=E9=87=8A=20+?= =?UTF-8?q?=20=E8=8A=82=E6=A0=87=E9=A2=98=E8=8B=B1=E6=96=87=E5=8C=96=20+?= =?UTF-8?q?=20}=E5=90=8E=E7=A9=BA=E8=A1=8C=20+=20return=E5=89=8D=E7=A9=BA?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 每个公开函数添加 /** @brief */ doc 注释 - 7 个节标题从中文改为英文 - 1386 行,全量编译 0e0w --- src/public/libfunc/src/myFunc.c | 333 ++++++++++++++++++++++++++++++-- 1 file changed, 312 insertions(+), 21 deletions(-) diff --git a/src/public/libfunc/src/myFunc.c b/src/public/libfunc/src/myFunc.c index af65a91..4a8017f 100644 --- a/src/public/libfunc/src/myFunc.c +++ b/src/public/libfunc/src/myFunc.c @@ -17,9 +17,7 @@ #include #include -/* ================================================================= - * 1. 校验计算 - * ================================================================= */ +/* ==== 1. Checksum: CRC16/32 + ByteSum + FileCRC ==== */ LOCAL const uint16_t _crc16_tab[256] = { 0x0000,0xc0c1,0xc181,0x0140,0xc301,0x03c0,0x0280,0xc241,0xc601,0x06c0,0x0780,0xc741,0x0500,0xc5c1,0xc481,0x0440, @@ -81,11 +79,13 @@ uint8_t func_cal_sum_byte(const uint8_t *d, uint32_t n) { return 0; } + uint8_t s = 0; for (uint32_t i = 0; i < n; i++) { s += d[i]; } + return s; } @@ -95,11 +95,13 @@ uint16_t func_cal_sum_word(const uint8_t *d, uint32_t n) { return 0; } + uint16_t s = 0; for (uint32_t i = 0; i < n; i++) { s += d[i]; } + return s; } @@ -109,11 +111,13 @@ uint16_t func_cal_crc16(const uint8_t *d, uint32_t n) { return 0; } + uint16_t crc = 0xFFFF; for (uint32_t i = 0; i < n; i++) { crc = (crc >> 8) ^ _crc16_tab[(uint8_t)(crc ^ d[i])]; } + return crc; } @@ -123,11 +127,13 @@ uint32_t func_cal_crc32(const uint8_t *d, uint32_t n) { return 0; } + uint32_t crc = 0xFFFFFFFF; for (uint32_t i = 0; i < n; i++) { crc = (crc >> 8) ^ _crc32_tab[(uint8_t)(crc ^ d[i])]; } + return crc ^ 0xFFFFFFFF; } @@ -137,11 +143,13 @@ uint16_t func_cal_file_crc16(const char *path) { return 0; } + FILE *fp = fopen(path, "rb"); if (!fp) { return 0; } + uint16_t crc = 0xFFFF; uint8_t buf[4096]; size_t n; @@ -152,7 +160,9 @@ uint16_t func_cal_file_crc16(const char *path) crc = (crc >> 8) ^ _crc16_tab[(uint8_t)(crc ^ buf[i])]; } } + fclose(fp); + return crc; } @@ -162,11 +172,13 @@ uint32_t func_cal_file_crc32(const char *path) { return 0; } + FILE *fp = fopen(path, "rb"); if (!fp) { return 0; } + uint32_t crc = 0xFFFFFFFF; uint8_t buf[4096]; size_t n; @@ -177,13 +189,13 @@ uint32_t func_cal_file_crc32(const char *path) crc = (crc >> 8) ^ _crc32_tab[(uint8_t)(crc ^ buf[i])]; } } + fclose(fp); + return crc ^ 0xFFFFFFFF; } -/* ================================================================= - * 2. 字符串转换 - * ================================================================= */ +/* ==== 2. String Convert ==== */ uint8_t func_hex_ch(char c) { @@ -191,14 +203,17 @@ uint8_t func_hex_ch(char c) { return (uint8_t)(c - '0'); } + if (c >= 'a' && c <= 'f') { return (uint8_t)(c - 'a' + 10); } + if (c >= 'A' && c <= 'F') { return (uint8_t)(c - 'A' + 10); } + return 0; } @@ -208,30 +223,40 @@ uint8_t func_dec_ch(char c) { return (uint8_t)(c - '0'); } + return 0; } +/** + * @brief Hex string to decimal int + */ int func_hex2dec(char *s) { if (!s) { return 0; } + int v = 0; while (*s) { v = (v << 4) | func_hex_ch(*s); s++; } + return v; } +/** + * @brief Dec string to int (supports leading minus) + */ int func_dec2dec(char *s) { if (!s) { return 0; } + int v = 0; int sign = 1; if (*s == '-') @@ -239,99 +264,134 @@ int func_dec2dec(char *s) sign = -1; s++; } + while (*s >= '0' && *s <= '9') { v = v * 10 + (*s - '0'); s++; } + return v * sign; } +/** + * @brief Hex string to byte buffer + */ int func_hex2buf(const char *s, char *dst, int *len) { if (!s || !dst || !len) { return -1; } + int n = (int)strlen(s); if (n & 1) { return -1; } + for (int i = 0; i < n / 2; i++) { dst[i] = (char)((func_hex_ch(s[i * 2]) << 4) | func_hex_ch(s[i * 2 + 1])); } + *len = n / 2; + return 0; } +/** + * @brief Int to right-aligned zero-padded dec string + */ char *func_dec2str(char *buf, int sz, int val, int width) { if (!buf || sz < 2) { return NULL; } + char fmt[16]; snprintf(fmt, sizeof(fmt), "%%0%dd", width); snprintf(buf, sz, fmt, val); + return buf; } +/** + * @brief Int to hex string + */ char *func_hex2str(char *buf, int sz, int val, int width) { if (!buf || sz < 2) { return NULL; } + if (width) { snprintf(buf, sz, "%0*X", width, val); } + else { snprintf(buf, sz, "%X", val); } + return buf; } +/** + * @brief Float to string + */ char *func_float2str(char *buf, int sz, float f, int width) { if (!buf || sz < 2) { return NULL; } + if (width) { snprintf(buf, sz, "%*.*f", width, width > 2 ? width - 2 : 1, f); } + else { snprintf(buf, sz, "%.6g", (double)f); } + return buf; } +/** + * @brief Byte array to upper hex string + */ char *func_buf2str(char *buf, int sz, const char *src, int n) { if (!buf || sz < 2 || !src) { return NULL; } + int pos = 0; for (int i = 0; i < n && pos + 3 < sz; i++) { pos += snprintf(buf + pos, sz - pos, "%02X", (unsigned char)src[i]); } + return buf; } +/** + * @brief Split string by whitespace into argc/argv + */ int func_str2argv(char *s, uint8_t *argc, char *argv[], uint8_t max) { if (!s || !argc || !argv) { return -1; } + *argc = 0; while (*s && *argc < max) { @@ -354,32 +414,40 @@ int func_str2argv(char *s, uint8_t *argc, char *argv[], uint8_t max) s++; } } + return 0; } -/* ================================================================= - * 3. 时间处理 - * ================================================================= */ +/* ==== 3. Time Process ==== */ +/** + * @brief stru_time_sys to formatted time string + */ char *func_time_sys2str(char *buf, int sz, stru_time_sys *t) { if (!buf || sz < 20 || !t) { return NULL; } + snprintf(buf, sz, "%04u-%02u-%02u %02u:%02u:%02u.%03u", t->year, t->month, t->day, t->hour, t->min, t->ms / 1000, t->ms % 1000); + return buf; } +/** + * @brief String to stru_time_sys + */ int func_str2time_sys(const char *s, stru_time_sys *t) { if (!s || !t) { return -1; } + memset(t, 0, sizeof(*t)); uint32_t y, mo, d, h, mi, sec, ms = 0; if (sscanf(s, "%u-%u-%u %u:%u:%u.%u", @@ -387,21 +455,27 @@ int func_str2time_sys(const char *s, stru_time_sys *t) { return -1; } + t->year = y; t->month = mo; t->day = d; t->hour = h; t->min = mi; t->ms = (uint16_t)(sec * 1000 + ms); + return 0; } +/** + * @brief Get current time (type: 1=sys, 2=cal) + */ int func_get_time(void *t, int type) { if (!t) { return -1; } + struct timeval tv; gettimeofday(&tv, NULL); if (type == 1) @@ -419,21 +493,27 @@ int func_get_time(void *t, int type) ts->min = (uint32_t)g->tm_min; ts->ms = (uint16_t)(g->tm_sec * 1000 + tv.tv_usec / 1000); } + else { stru_time_cal *tc = (stru_time_cal *)t; tc->sec = tv.tv_sec; tc->usec = tv.tv_usec; } + return 0; } +/** + * @brief Set system time (requires root) + */ int func_set_time(void *t, int type) { if (!t) { return -1; } + struct timeval tv; if (type == 1) { @@ -448,21 +528,27 @@ int func_set_time(void *t, int type) tv.tv_sec = mktime(&g); tv.tv_usec = (ts->ms % 1000) * 1000; } + else { stru_time_cal *tc = (stru_time_cal *)t; tv.tv_sec = tc->sec; tv.tv_usec = tc->usec; } + return settimeofday(&tv, NULL); } +/** + * @brief stru_time_sys to stru_time_cal + */ void func_time_sys2cal(stru_time_sys *src, stru_time_cal *dst) { if (!src || !dst) { return; } + struct tm g = {0}; g.tm_year = (int)src->year - 1900; g.tm_mon = (int)src->month - 1; @@ -474,17 +560,22 @@ void func_time_sys2cal(stru_time_sys *src, stru_time_cal *dst) dst->usec = (src->ms % 1000) * 1000; } +/** + * @brief stru_time_cal to stru_time_sys + */ void func_time_cal2sys(stru_time_cal *src, stru_time_sys *dst) { if (!src || !dst) { return; } + struct tm *g = localtime(&src->sec); if (!g) { return; } + dst->year = g->tm_year + 1900; dst->month = g->tm_mon + 1; dst->day = g->tm_mday; @@ -493,21 +584,24 @@ void func_time_cal2sys(stru_time_cal *src, stru_time_sys *dst) dst->ms = (uint16_t)(g->tm_sec * 1000 + src->usec / 1000); } -/* ================================================================= - * 4. 文件目录操作 - * ================================================================= */ +/* ==== 4. File & Directory ==== */ +/** + * @brief Check if directory exists + */ int func_dir_exist(const char *p) { if (!p) { return 0; } + struct stat st; if (stat(p, &st) == 0 && S_ISDIR(st.st_mode)) { return 1; } + return 0; } @@ -517,6 +611,7 @@ LOCAL int _mkdir(const char *p) { return -1; } + char tmp[256]; strncpy(tmp, p, sizeof(tmp) - 1); tmp[sizeof(tmp) - 1] = '\0'; @@ -529,9 +624,13 @@ LOCAL int _mkdir(const char *p) *x = '/'; } } + return mkdir(tmp, 0755); } +/** + * @brief Recursively create directories + */ int func_make_dirs(const char *p) { return _mkdir(p); @@ -543,11 +642,13 @@ LOCAL int _rmdir(const char *p) { return -1; } + DIR *d = opendir(p); if (!d) { return remove(p); } + struct dirent *e; while ((e = readdir(d))) { @@ -559,37 +660,55 @@ LOCAL int _rmdir(const char *p) snprintf(full, sizeof(full), "%s/%s", p, e->d_name); _rmdir(full); } + closedir(d); + return rmdir(p); } +/** + * @brief Recursively delete directory tree + */ int func_del_dirs(const char *p) { return _rmdir(p); } +/** + * @brief Recursively delete directory tree + */ +/** + * @brief Delete directory via rm -rf shell command + */ int func_del_dirs_cmd(const char *p) { if (!p) { return -1; } + char cmd[512]; snprintf(cmd, sizeof(cmd), "rm -rf '%s'", p); + return system(cmd); } +/** + * @brief Check if regular file exists + */ int func_file_exist(const char *p) { if (!p) { return 0; } + struct stat st; if (stat(p, &st) == 0 && S_ISREG(st.st_mode)) { return 1; } + return 0; } @@ -599,27 +718,35 @@ uint32_t func_file_size(const char *p) { return 0; } + struct stat st; if (stat(p, &st) == 0) { return (uint32_t)st.st_size; } + return 0; } +/** + * @brief Read file into pre-allocated buffer + */ int func_read_file(const char *p, char *buf, uint32_t cap, uint32_t *out) { if (!p || !buf || !cap || !out) { return -1; } + FILE *fp = fopen(p, "rb"); if (!fp) { return -1; } + *out = (uint32_t)fread(buf, 1, cap, fp); fclose(fp); + return 0; } @@ -629,61 +756,83 @@ uint8_t *func_read_file_alloc(const char *p, uint32_t *out) { return NULL; } + *out = 0; struct stat st; if (stat(p, &st) != 0) { return NULL; } + uint8_t *buf = (uint8_t *)malloc((size_t)st.st_size + 1); if (!buf) { return NULL; } + FILE *fp = fopen(p, "rb"); if (!fp) { free(buf); + return NULL; } + *out = (uint32_t)fread(buf, 1, (size_t)st.st_size, fp); buf[*out] = '\0'; fclose(fp); + return buf; } +/** + * @brief Write buffer to file (overwrite mode) + */ int func_write_file(const char *p, const char *buf, uint32_t n) { if (!p || !buf) { return -1; } + FILE *fp = fopen(p, "wb"); if (!fp) { return -1; } + fwrite(buf, 1, n, fp); fclose(fp); + return 0; } +/** + * @brief Read file into pre-allocated buffer + */ +/** + * @brief Read structured file info header (256B) + */ int func_read_file_info(const char *p, stru_file_info *info, int check) { if (!p || !info) { return -1; } + FILE *fp = fopen(p, "rb"); if (!fp) { return -1; } + if (fread(info, 1, sizeof(*info), fp) != sizeof(*info)) { fclose(fp); + return -1; } + fclose(fp); if (check) { @@ -700,44 +849,56 @@ int func_read_file_info(const char *p, stru_file_info *info, int check) return -1; } } + return 0; } -/* ================================================================= - * 5. 进程管理 - * ================================================================= */ +/* ==== 5. Process Manager (Linux /proc) ==== */ +/** + * @brief Get current process name via /proc/self/comm + */ int func_proc_self_name(char *buf, uint32_t sz) { if (!buf || sz == 0) { return -1; } + FILE *fp = fopen("/proc/self/comm", "r"); if (!fp) { return -1; } + if (!fgets(buf, (int)sz, fp)) { fclose(fp); + return -1; } + size_t len = strlen(buf); if (len > 0 && buf[len - 1] == '\n') { buf[len - 1] = '\0'; } + fclose(fp); + return 0; } +/** + * @brief Get process name by PID + */ int func_proc_name_by_pid(int pid, char *buf, uint32_t sz) { if (!buf || sz == 0) { return -1; } + char path[64]; snprintf(path, sizeof(path), "/proc/%d/comm", pid); FILE *fp = fopen(path, "r"); @@ -745,36 +906,52 @@ int func_proc_name_by_pid(int pid, char *buf, uint32_t sz) { return -1; } + if (!fgets(buf, (int)sz, fp)) { fclose(fp); + return -1; } + size_t len = strlen(buf); if (len > 0 && buf[len - 1] == '\n') { buf[len - 1] = '\0'; } + fclose(fp); + return 0; } +/** + * @brief Get current process PID + */ int func_proc_pid(void) { return (int)getpid(); } +/** + * @brief Get current process PID + */ +/** + * @brief Find PID by process name (scan /proc) + */ int func_proc_pid_by_name(const char *name) { if (!name) { return -1; } + DIR *d = opendir("/proc"); if (!d) { return -1; } + struct dirent *e; while ((e = readdir(d))) { @@ -801,15 +978,21 @@ int func_proc_pid_by_name(const char *name) { fclose(fp); closedir(d); + return atoi(e->d_name); } } fclose(fp); } + closedir(d); + return -1; } +/** + * @brief Check if process exists by PID + */ int func_proc_exist_by_pid(int pid) { char path[64]; @@ -819,24 +1002,33 @@ int func_proc_exist_by_pid(int pid) { return 1; } + return 0; } +/** + * @brief Check if process exists by name + */ int func_proc_exist_by_name(const char *name) { if (func_proc_pid_by_name(name) > 0) { return 1; } + return 0; } +/** + * @brief Get executable path by PID + */ int func_proc_path_by_pid(int pid, char *buf, uint32_t sz) { if (!buf || sz == 0) { return -1; } + char link[64]; snprintf(link, sizeof(link), "/proc/%d/exe", pid); ssize_t n = readlink(link, buf, sz - 1); @@ -844,33 +1036,44 @@ int func_proc_path_by_pid(int pid, char *buf, uint32_t sz) { return -1; } + buf[n] = '\0'; + return 0; } +/** + * @brief Get current process executable path + */ int func_proc_self_path(char *buf, uint32_t sz) { return func_proc_path_by_pid(func_proc_pid(), buf, sz); } +/** + * @brief Get current process directory + */ int func_proc_self_dir(char *buf, uint32_t sz) { if (func_proc_self_path(buf, sz) != 0) { return -1; } + char *slash = strrchr(buf, '/'); if (slash) { *slash = '\0'; } + return 0; } -/* ================================================================= - * 6. 环境变量路径 - * ================================================================= */ +/* ==== 6. Environment Paths ==== */ +/** + * @brief Get WORK_PATH env var + */ int func_get_work_path(char *b, uint32_t s) { const char *v = getenv("WORK_PATH"); @@ -878,10 +1081,15 @@ int func_get_work_path(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get SYS_CFG_PATH env var + */ int func_get_syscfg_path(char *b, uint32_t s) { const char *v = getenv("SYS_CFG_PATH"); @@ -889,10 +1097,15 @@ int func_get_syscfg_path(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get APP_ROOT_PATH env var + */ int func_get_app_root(char *b, uint32_t s) { const char *v = getenv("APP_ROOT_PATH"); @@ -900,10 +1113,15 @@ int func_get_app_root(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get HIS_ROOT_PATH env var + */ int func_get_his_root(char *b, uint32_t s) { const char *v = getenv("HIS_ROOT_PATH"); @@ -911,10 +1129,15 @@ int func_get_his_root(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get LOG_ROOT_PATH env var + */ int func_get_log_root(char *b, uint32_t s) { const char *v = getenv("LOG_ROOT_PATH"); @@ -922,10 +1145,15 @@ int func_get_log_root(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get DBC_ROOT_PATH env var + */ int func_get_dbc_root(char *b, uint32_t s) { const char *v = getenv("DBC_ROOT_PATH"); @@ -933,10 +1161,15 @@ int func_get_dbc_root(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get SHELL_PATH env var + */ int func_get_shell_path(char *b, uint32_t s) { const char *v = getenv("SHELL_PATH"); @@ -944,10 +1177,15 @@ int func_get_shell_path(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } +/** + * @brief Get UPDATE_PATH env var + */ int func_get_update_path(char *b, uint32_t s) { const char *v = getenv("UPDATE_PATH"); @@ -955,7 +1193,9 @@ int func_get_update_path(char *b, uint32_t s) { return -1; } + snprintf(b, s, "%s", v); + return 0; } @@ -966,129 +1206,180 @@ LOCAL int _make_path(const char *key, const char *app, const char *pfx, { return -1; } + char root[256]; const char *v = getenv(key); if (!v) { v = "/tmp"; } + snprintf(root, sizeof(root), "%s", v); if (pfx && pfx[0]) { snprintf(buf, sz, "%s/%s/%s", root, app, pfx); } + else { snprintf(buf, sz, "%s/%s", root, app); } + return 0; } +/** + * @brief Build app path: root/app_name + */ int func_get_app_path(const char *a, char *b, uint32_t s) { return _make_path("APP_ROOT_PATH", a, NULL, b, s); } +/** + * @brief Build app config path: root/app_name/ext + */ int func_get_app_cfg(const char *a, const char *e, char *b, uint32_t s) { return _make_path("APP_ROOT_PATH", a, e, b, s); } +/** + * @brief Build app history path + */ int func_get_app_his(const char *a, char *b, uint32_t s) { return _make_path("HIS_ROOT_PATH", a, NULL, b, s); } +/** + * @brief Build app log path + */ int func_get_app_log(const char *a, char *b, uint32_t s) { return _make_path("LOG_ROOT_PATH", a, NULL, b, s); } -/* ================================================================= - * 7. IPC 消息队列 (System V) - * ================================================================= */ +/* ==== 7. IPC Message Queue (System V) ==== */ +/** + * @brief Create IPC message queue by process name + */ int func_ipc_create_by_name(char *name, int *qid) { if (!name || !qid) { return -1; } + int pid = func_proc_pid_by_name(name); if (pid < 0) { return -1; } + return func_ipc_create_by_pid(pid, qid); } +/** + * @brief Create IPC message queue by PID + */ int func_ipc_create_by_pid(int pid, int *qid) { if (!qid || pid < 1) { return -1; } + key_t k = ftok("/tmp", pid & 0xFF); *qid = msgget(k, IPC_CREAT | 0666); if (*qid >= 0) { return 0; } + return -1; } +/** + * @brief Get/create IPC message queue by name + */ int func_ipc_get_by_name(const char *name, int *qid) { return func_ipc_create_by_name((char *)name, qid); } +/** + * @brief Get/create IPC message queue by PID + */ int func_ipc_get_by_pid(int pid, int *qid) { return func_ipc_create_by_pid(pid, qid); } +/** + * @brief Send raw bytes to message queue + */ int func_ipc_send_buf(int qid, uint8_t *tx, uint32_t n) { if (!tx || n == 0) { return -1; } + return msgsnd(qid, tx, n, 0); } +/** + * @brief Receive raw bytes from message queue + */ int func_ipc_recv_buf(int qid, uint8_t *rx, uint32_t n) { if (!rx || n == 0) { return -1; } + return (int)msgrcv(qid, rx, n, 0, 0); } +/** + * @brief Send struct message to message queue + */ int func_ipc_send_msg(int qid, stru_ipc_msg *m) { if (!m) { return -1; } + return msgsnd(qid, &m->t, sizeof(m->t) - sizeof(m->t.len) + (size_t)m->t.len, 0); } +/** + * @brief Receive struct message from message queue + */ int func_ipc_recv_msg(int qid, stru_ipc_msg *m) { if (!m) { return -1; } + ssize_t n = msgrcv(qid, &m->t, sizeof(m->t), m->id, 0); if (n < 0) { return -1; } + m->id = (long)n; + return 0; } +/** + * @brief Delete message queue + */ int func_ipc_delete(int qid) { return msgctl(qid, IPC_RMID, NULL);