Rdzleo aeae073e4f chore(git): 把 components/common/ 纳入 git 跟踪
components/common/ 是项目自己写的代码 (火山 RTC SDK 的 wrapper + HTTP 客户端 + JSON
工具 + 设备管理), 历史上被 .gitignore 的 components/ 规则误排除。共 15 个文件 2750
行项目代码长期未被 git 跟踪, 修改易丢失, 不利于多设备开发和回溯。

主要变动:

1. .gitignore
   - 改 components/ → /components/* (顶层 children 而非目录本身)
   - 加 !/components/common/ 例外, 让项目自己代码进入跟踪
   - 加 esp-spot/**/components/ 显式 ignore 子项目里的 components/ 保持原行为

2. components/common/ 首次入 git (~2750 行)
   - inc/volc_rtc.h, src/volc_rtc.c — 火山 RTC SDK 的封装层
   - inc/volc_http.h, src/volc_http.c — HTTP 客户端
   - inc/util/volc_json.h, src/volc_json.c — JSON 工具
   - inc/base/volc_device_manager.h, src/volc_device_manager.c — RTC 设备凭证管理
   - inc/util/volc_log.h — 日志宏
   - inc/util/volc_list.h — 链表工具
   - inc/volc_conv_ai.h — 会话 AI 接口定义
   - inc/volc_platform.h, src/volc_platform.c — 平台抽象
   - inc/base/volc_base.h — 基础类型

未跟踪的兄弟目录 (保持 ignore):
   - components/78__esp-opus-encoder/ (IDF managed component)
   - components/volc_engine_rtc_lite/ (火山 RTC SDK 二进制库)
   - components/zlib/ (第三方库)

后续 fix(rtc) NULL guard 等 components/common/ 的改动将作为独立 commit。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:50:52 +08:00

135 lines
3.3 KiB
C

// Copyright (2025) Beijing Volcano Engine Technology Ltd.
// SPDX-License-Identifier: Apache-2.0
#ifndef __VOLC_LIST_H__
#define __VOLC_LIST_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief double list
*/
typedef struct _volc_list_node_t {
struct _volc_list_node_t *next;
struct _volc_list_node_t *prev;
} volc_list_node_t;
typedef struct _volc_list_t {
volc_list_node_t *head;
volc_list_node_t *tail;
uint32_t count;
} volc_list_t;
/**
* @brief initialize a list
*/
#define volc_list_init(list) \
do { \
(list)->head = NULL; \
(list)->tail = NULL; \
(list)->count = 0; \
} while(0)
/**
* @brief add a node to the list head
*/
#define volc_list_add(list, node) \
do { \
if ((list)->head == NULL) { \
(list)->head = (list)->tail = node; \
(node)->prev = (node)->next = NULL; \
} else { \
(node)->next = (list)->head; \
(list)->head->prev = node; \
(node)->prev = NULL; \
(list)->head = node; \
} \
(list)->count++; \
} while(0)
/**
* @brief add a node to the list tail
*/
#define volc_list_add_tail(list, node) \
do { \
if ((list)->tail == NULL) { \
(list)->head = (list)->tail = node; \
(node)->prev = (node)->next = NULL; \
} else { \
(node)->prev = (list)->tail; \
(list)->tail->next = node; \
(node)->next = NULL; \
(list)->tail = node; \
} \
(list)->count++; \
} while(0)
/**
* @brief delete a node from the list
*/
#define volc_list_del(list, node) \
do { \
if ((list)->head == NULL) { \
break; \
} \
if ((list)->head == node) { \
(list)->head = node->next; \
if ((list)->head != NULL) { \
(list)->head->prev = NULL; \
} else { \
(list)->tail = NULL; \
} \
} else if ((list)->tail == node) { \
(list)->tail = node->prev; \
if ((list)->tail != NULL) { \
(list)->tail->next = NULL; \
} else { \
(list)->head = NULL; \
} \
} else { \
if ((node)->prev != NULL && (node)->next != NULL) { \
(node)->prev->next = (node)->next; \
(node)->next->prev = (node)->prev; \
} \
} \
(list)->count--; \
(node)->next = NULL; \
(node)->prev = NULL; \
} while(0)
/**
* @brief check if a list is empty
*/
#define volc_list_empty(list) ((list)->head == NULL)
/**
* @brief get the first node of a list
*/
#define volc_list_first(list) ((list)->head)
/**
* @brief get the last node of a list
*/
#define volc_list_last(list) ((list)->tail)
/**
* @brief iterate through a list
*/
#define volc_list_for_each(list, node) \
for ((node) = (list)->head; (node) != NULL; (node) = (node)->next)
/**
* @brief iterate through a list safe against removal of list entry
*/
#define volc_list_for_each_safe(list, node, n) \
for ((node) = (list)->head, (n) = (node) ? (node)->next : NULL; \
(node) != NULL; \
(node) = (n), (n) = (node) ? (node)->next : NULL)
#ifdef __cplusplus
}
#endif
#endif // __VOLC_LIST_H__