chore: 更新 .gitignore 文件

- 添加 docs 文件夹到忽略列表,以忽略 Doxygen 生成的文件
- 保持原有的忽略规则不变
This commit is contained in:
ZZY
2025-04-05 23:11:39 +08:00
parent c800b48ca2
commit 8d97fe896c
32 changed files with 3939 additions and 187 deletions

View File

@ -1,33 +1,59 @@
/**
* @file color.h
* @brief ANSI终端颜色控制码定义
*
* 提供跨平台的终端文本颜色和样式控制支持
*/
#ifndef __SMCC_TERMINAL_COLOR_H__
#define __SMCC_TERMINAL_COLOR_H__
#define ANSI_FG_BLACK "\33[30m"
#define ANSI_FG_RED "\33[31m"
#define ANSI_FG_GREEN "\33[32m"
#define ANSI_FG_YELLOW "\33[33m"
#define ANSI_FG_BLUE "\33[34m"
#define ANSI_FG_MAGENTA "\33[35m"
#define ANSI_FG_CYAN "\33[36m"
#define ANSI_FG_WHITE "\33[37m"
/// @name 前景色控制码
/// @{
#define ANSI_FG_BLACK "\33[30m" ///< 黑色前景
#define ANSI_FG_RED "\33[31m" ///< 红色前景
#define ANSI_FG_GREEN "\33[32m" ///< 绿色前景
#define ANSI_FG_YELLOW "\33[33m" ///< 黄色前景
#define ANSI_FG_BLUE "\33[34m" ///< 蓝色前景
#define ANSI_FG_MAGENTA "\33[35m" ///< 品红色前景
#define ANSI_FG_CYAN "\33[36m" ///< 青色前景
#define ANSI_FG_WHITE "\33[37m" ///< 白色前景
/// @}
#define ANSI_BG_BLACK "\33[40m"
#define ANSI_BG_RED "\33[41m"
#define ANSI_BG_GREEN "\33[42m"
#define ANSI_BG_YELLOW "\33[43m"
#define ANSI_BG_BLUE "\33[44m"
#define ANSI_BG_MAGENTA "\33[35m"
#define ANSI_BG_CYAN "\33[46m"
#define ANSI_BG_WHITE "\33[47m"
/// @name 背景色控制码
/// @{
#define ANSI_BG_BLACK "\33[40m" ///< 黑色背景
#define ANSI_BG_RED "\33[41m" ///< 红色背景
#define ANSI_BG_GREEN "\33[42m" ///< 绿色背景
#define ANSI_BG_YELLOW "\33[43m" ///< 黄色背景
#define ANSI_BG_BLUE "\33[44m" ///< 蓝色背景
#define ANSI_BG_MAGENTA "\33[45m" ///< 品红色背景原始代码此处应为45m
#define ANSI_BG_CYAN "\33[46m" ///< 青色背景
#define ANSI_BG_WHITE "\33[47m" ///< 白色背景
/// @}
#define ANSI_UNDERLINED "\33[4m"
#define ANSI_BOLD "\33[1m"
#define ANSI_NONE "\33[0m"
/// @name 文字样式控制码
/// @{
#define ANSI_UNDERLINED "\33[4m" ///< 下划线样式
#define ANSI_BOLD "\33[1m" ///< 粗体样式
#define ANSI_NONE "\33[0m" ///< 重置所有样式
/// @}
// Maybe Some Terminal Doesn't Support Color
/**
* @def ANSI_FMT
* @brief 安全文本格式化宏
* @param str 目标字符串
* @param fmt ANSI格式序列可组合多个样式
*
* @note 当定义ANSI_FMT_DISABLE时自动禁用颜色输出
* @code
* printf(ANSI_FMT("Warning!", ANSI_FG_YELLOW ANSI_BOLD));
* @endcode
*/
#ifndef ANSI_FMT_DISABLE
#define ANSI_FMT(str, fmt) fmt str ANSI_NONE
#define ANSI_FMT(str, fmt) fmt str ANSI_NONE ///< 启用样式包裹
#else
#define ANSI_FMT(str, fmt) str
#define ANSI_FMT(str, fmt) str ///< 禁用样式输出
#endif
#endif
#endif // __SMCC_TERMINAL_COLOR_H__

View File

@ -20,7 +20,8 @@ static void default_handler(log_level_t level, const char* module, const char* f
case LOG_LEVEL_TRACE: level_str = "TRACE"; break;
default: level_str = "NOTSET"; break;
}
/// @note: 定义 __LOG_NO_COLOR__ 会取消颜色输出
#ifndef __LOG_NO_COLOR__
const char* color_code = ANSI_NONE;
switch (level) {
@ -50,6 +51,12 @@ static logger_t root_logger = {
.handler = default_handler,
};
void init_logger(logger_t* logger, const char* name) {
logger->name = name;
logger->handler = default_handler;
log_set_level(logger, LOG_LEVEL_ALL);
}
logger_t* log_get(const char* name) {
return &root_logger;
}

View File

@ -1,21 +1,39 @@
/**
* @file log.h
* @brief 日志系统核心模块(支持多级日志、断言和异常处理)
*/
#ifndef __SMCC_LOG_H__
#define __SMCC_LOG_H__
#include "../std/rt_api_def.h"
#include "color.h"
/**
* @brief 日志级别枚举
*
* 定义日志系统的输出级别和组合标志位
*/
typedef enum log_level {
LOG_LEVEL_NOTSET = 0,
LOG_LEVEL_DEBUG = 1 << 0,
LOG_LEVEL_INFO = 1 << 1,
LOG_LEVEL_WARN = 1 << 2,
LOG_LEVEL_ERROR = 1 << 3,
LOG_LEVEL_FATAL = 1 << 4,
LOG_LEVEL_TRACE = 1 << 5,
LOG_LEVEL_ALL = 0xFF,
LOG_LEVEL_NOTSET = 0, ///< 未设置级别(继承默认配置)
LOG_LEVEL_DEBUG = 1 << 0, ///< 调试信息(开发阶段详细信息)
LOG_LEVEL_INFO = 1 << 1, ///< 常规信息(系统运行状态)
LOG_LEVEL_WARN = 1 << 2, ///< 警告信息(潜在问题提示)
LOG_LEVEL_ERROR = 1 << 3, ///< 错误信息(可恢复的错误)
LOG_LEVEL_FATAL = 1 << 4, ///< 致命错误(导致程序终止的严重错误)
LOG_LEVEL_TRACE = 1 << 5, ///< 追踪(性能追踪或者栈帧追踪)
LOG_LEVEL_ALL = 0xFF, ///< 全级别标志(组合所有日志级别)
} log_level_t;
/**
* @brief 日志处理回调函数类型
* @param level 日志级别
* @param module 模块名称可为NULL
* @param file 源文件名
* @param line 代码行号
* @param message 格式化后的日志消息
* @todo 待实现模块名称,输入的模块名称,都将被忽略
*/
typedef void (*log_handler)(
log_level_t level,
const char* module,
@ -25,51 +43,119 @@ typedef void (*log_handler)(
);
#ifndef LOGGER_MAX_BUF_SIZE
#define LOGGER_MAX_BUF_SIZE 256
#define LOGGER_MAX_BUF_SIZE 512 ///< 单条日志最大缓冲区尺寸
#endif
/**
* @brief 日志器实例结构体
*
* 每个日志器实例维护独立的配置和缓冲区
*/
typedef struct logger {
const char* name;
log_level_t level;
log_handler handler;
char buf[LOGGER_MAX_BUF_SIZE];
const char* name; ///< 日志器名称(用于模块区分)
log_level_t level; ///< 当前设置的日志级别
log_handler handler; ///< 日志处理回调函数
char buf[LOGGER_MAX_BUF_SIZE]; ///< 格式化缓冲区
} logger_t;
/**
* @brief 初始化日志实例 其余参数设置为默认值
* @param[in] logger 日志器实例指针
* @param[in] name 日志器名称NULL表示获取默认日志器名称
*/
void init_logger(logger_t* logger, const char* name);
// TODO log_set(); 暂未实现 日志注册
/**
* @brief 获取或创建日志器实例
* @param[in] name 日志器名称NULL表示获取默认日志器
* @return 日志器实例指针
* @warning 若没有找到相应日志器则会返回根日志器
*/
logger_t* log_get(const char* name);
/**
* @brief 设置日志级别
* @param[in] logger 目标日志器实例
* @param[in] level 要设置的日志级别(可组合多个级别)
*/
void log_set_level(logger_t* logger, log_level_t level);
/**
* @brief 设置自定义日志处理器
* @param[in] logger 目标日志器实例
* @param[in] handler 自定义处理函数NULL恢复默认处理
*/
void log_set_handler(logger_t* logger, log_handler handler);
#ifndef LOG_MAX_MAROC_BUF_SIZE
#define LOG_MAX_MAROC_BUF_SIZE LOGGER_MAX_BUF_SIZE
#define LOG_MAX_MAROC_BUF_SIZE LOGGER_MAX_BUF_SIZE ///< 宏展开缓冲区尺寸
#endif
#define _LOG(_level_, _msg_, ...) \
/**
* @def _LOG
* @brief 内部日志宏(供其他日志宏调用)
* @param _module_ 模块实例NULL表示使用默认日志器
* @param _level_ 日志级别
* @param _msg_ 格式字符串
* @param ... 可变参数列表
*/
#define _LOG(_module_, _level_, _msg_, ...) \
do { \
logger_t* _logger = log_get(NULL); \
logger_t* _logger; \
if (!_module_) { \
_logger = log_get(NULL); \
} \
else _logger = _module_; \
if (_logger && _logger->handler && (_logger->level & (_level_))) { \
rt.snprintf(_logger->buf, sizeof(_logger->buf), (_msg_), ##__VA_ARGS__); \
_logger->handler((_level_), _logger->name, __FILE__, __LINE__, _logger->buf); \
} \
} while(0)
#define LOG_NOTSET(...) _LOG(LOG_LEVEL_NOTSET, __VA_ARGS__)
#define LOG_DEBUG(...) _LOG(LOG_LEVEL_DEBUG, __VA_ARGS__)
#define LOG_INFO(...) _LOG(LOG_LEVEL_INFO, __VA_ARGS__)
#define LOG_WARN(...) _LOG(LOG_LEVEL_WARN, __VA_ARGS__)
#define LOG_ERROR(...) _LOG(LOG_LEVEL_ERROR, __VA_ARGS__)
#define LOG_FATAL(...) _LOG(LOG_LEVEL_FATAL, __VA_ARGS__)
#define LOG_TRACE(...) _LOG(LOG_LEVEL_TRACE, __VA_ARGS__)
/// @name 模块日志宏
/// @{
#define MLOG_NOTSET(module, ...) _LOG(module, LOG_LEVEL_NOTSET, __VA_ARGS__) ///< 未分类日志
#define MLOG_DEBUG( module, ...) _LOG(module, LOG_LEVEL_DEBUG, __VA_ARGS__) ///< 调试日志需启用DEBUG级别
#define MLOG_INFO( module, ...) _LOG(module, LOG_LEVEL_INFO, __VA_ARGS__) ///< 信息日志(常规运行日志)
#define MLOG_WARN( module, ...) _LOG(module, LOG_LEVEL_WARN, __VA_ARGS__) ///< 警告日志(潜在问题)
#define MLOG_ERROR( module, ...) _LOG(module, LOG_LEVEL_ERROR, __VA_ARGS__) ///< 错误日志(可恢复错误)
#define MLOG_FATAL( module, ...) _LOG(module, LOG_LEVEL_FATAL, __VA_ARGS__) ///< 致命错误日志(程序终止前)
#define MLOG_TRACE( module, ...) _LOG(module, LOG_LEVEL_TRACE, __VA_ARGS__) ///< 追踪日志(调用栈跟踪)
/// @}
/// @name 快捷日志宏
/// @{
#define LOG_NOTSET(...) _LOG(NULL, LOG_LEVEL_NOTSET, __VA_ARGS__) ///< 未分类日志
#define LOG_DEBUG(...) _LOG(NULL, LOG_LEVEL_DEBUG, __VA_ARGS__) ///< 调试日志需启用DEBUG级别
#define LOG_INFO(...) _LOG(NULL, LOG_LEVEL_INFO, __VA_ARGS__) ///< 信息日志(常规运行日志)
#define LOG_WARN(...) _LOG(NULL, LOG_LEVEL_WARN, __VA_ARGS__) ///< 警告日志(潜在问题)
#define LOG_ERROR(...) _LOG(NULL, LOG_LEVEL_ERROR, __VA_ARGS__) ///< 错误日志(可恢复错误)
#define LOG_FATAL(...) _LOG(NULL, LOG_LEVEL_FATAL, __VA_ARGS__) ///< 致命错误日志(程序终止前)
#define LOG_TRACE(...) _LOG(NULL, LOG_LEVEL_TRACE, __VA_ARGS__) ///< 追踪日志(调用栈跟踪)
/// @}
/**
* @def _Assert
* @brief 断言检查内部宏
* @param cond 检查条件表达式
* @param ... 错误信息参数(格式字符串+参数)
*/
#define _Assert(cond, ...) \
do { \
if (!(cond)) { \
LOG_FATAL(__VA_ARGS__); \
} \
} while (0)
#define AssertFmt(cond, format, ...) _Assert(cond, "Assertion Failure: " format, ## __VA_ARGS__)
#define PanicFmt(format, ...) _Assert(0, "Panic: " format, ## __VA_ARGS__)
#define Assert(cond) AssertFmt(cond, "cond is `" SMCC_STR(cond) "`")
#define Panic(...) PanicFmt(__VA_ARGS__)
#define TODO() PanicFmt("TODO please implement me")
#endif
/// @name 断言工具宏
/// @{
#define AssertFmt(cond, format, ...) _Assert(cond, "Assertion Failure: " format, ## __VA_ARGS__) ///< 带格式的断言检查
#define PanicFmt(format, ...) _Assert(0, "Panic: " format, ## __VA_ARGS__) ///< 立即触发致命错误
#define Assert(cond) AssertFmt(cond, "cond is `" SMCC_STR(cond) "`") ///< 基础断言检查
#define Panic(...) PanicFmt(__VA_ARGS__) ///< 触发致命错误(带自定义消息)
#define TODO() PanicFmt("TODO please implement me") ///< 标记未实现代码(触发致命错误)
/// @}
#endif // __SMCC_LOG_H__

View File

@ -1,36 +1,132 @@
/**
* @file rt_alloc.h
* @brief 内存分配器接口
*
* 提供三种内存分配器实现:简单分配器、固定大小分配器和长块分配器
*/
#ifndef __SMCC_RT_ALLOC_H__
#define __SMCC_RT_ALLOC_H__
#include "std/rt_api_def.h"
// Simple or Static Allocator
/** @defgroup simple_allocator 简单分配器 */
/**
* @brief 分配指定大小的内存块
* @param size 请求分配的内存大小(字节)
* @return 成功返回内存指针失败返回NULL
*/
void* salloc_alloc(int size);
/**
* @brief 重新分配内存块
* @param ptr 原内存指针
* @param size 新内存大小(字节)
* @return 成功返回新内存指针失败返回NULL
*/
void* salloc_realloc(void* ptr, int size);
/**
* @brief 释放内存块
* @param ptr 要释放的内存指针
*/
void salloc_free(void* ptr);
/** @defgroup fixed_allocator 固定大小分配器 */
/**
* @struct fixed_alloc_t
* @brief 固定大小内存分配器上下文
*/
typedef struct fixed_alloc {
/** @brief 内存页链表头指针 */
void* page_list;
/** @brief 空闲块链表头指针 */
void* free_list;
/** @brief 每个内存块的固定大小 */
int block_size;
/** @brief 每页包含的块数量 */
int blocks_per_page;
} fixed_alloc_t;
/**
* @brief 初始化固定大小分配器
* @param fa 分配器上下文指针
* @param fixed_size 每个内存块的固定大小
* @param init_size 初始预分配块数量
*/
void falloc_init(fixed_alloc_t* fa, int fixed_size, int init_size);
/**
* @brief 分配固定大小内存块
* @param fa 分配器上下文指针
* @return 成功返回内存指针失败返回NULL
*/
void* falloc_alloc(fixed_alloc_t* fa);
/**
* @brief 释放内存块
* @param fa 分配器上下文指针
* @param ptr 要释放的内存指针
*/
void falloc_free(fixed_alloc_t* fa, void* ptr);
/**
* @brief 销毁分配器并释放所有内存页
* @param fa 分配器上下文指针
*/
void falloc_destroy(fixed_alloc_t* fa);
/** @defgroup long_allocator 长块分配器 */
/**
* @struct long_block_t
* @brief 长块内存块头结构
*/
typedef struct long_block {
/** @brief 指向下一个内存块的指针 */
struct long_block* next;
/** @brief 当前块使用状态标志 */
int used;
} long_block_t;
/**
* @struct long_alloc_t
* @brief 长块分配器上下文
*/
typedef struct long_alloc {
/** @brief 当前内存块指针 */
long_block_t* current;
/** @brief 内存块的标准大小 */
int block_size;
} long_alloc_t;
/**
* @brief 初始化长块分配器
* @param la 分配器上下文指针
*/
void lalloc_init(long_alloc_t* la);
/**
* @brief 分配指定大小的内存块
* @param la 分配器上下文指针
* @param size 请求分配的内存大小
* @return 成功返回内存指针失败返回NULL
*/
void* lalloc_alloc(long_alloc_t* la, int size);
/**
* @brief 标记释放内存块(实际在块耗尽时统一释放)
* @param la 分配器上下文指针
* @param ptr 要释放的内存指针
*/
void lalloc_free(long_alloc_t* la, void* ptr);
/**
* @brief 销毁分配器并释放所有内存块
* @param la 分配器上下文指针
*/
void lalloc_destroy(long_alloc_t* la);
#endif
#endif // __SMCC_RT_ALLOC_H__

View File

@ -25,11 +25,11 @@ void* rt_memcpy(void* restrict dest, const void* restrict src, rt_size_t n) {
return dest;
}
void* rt_memset(void* s, int c, rt_size_t n) {
u8_t* p = s;
void* rt_memset(void* dest, int val, rt_size_t n) {
u8_t* p = dest;
for (rt_size_t i = 0; i < n; ++i)
p[i] = (u8_t)c;
return s;
p[i] = (u8_t)val;
return dest;
}
rt_size_t rt_strlen(const char* s) {

View File

@ -1,15 +1,67 @@
/**
* @file rt_string.h
* @brief 运行时字符串与内存操作
*
* 提供基本的内存操作和字符串处理函数实现
*/
#ifndef __SMCC_RT_STRING_H__
#define __SMCC_RT_STRING_H__
#include "std/rt_api_def.h"
/** @defgroup memory_operations 内存操作 */
/**
* @brief 内存区域比较
* @param s1 第一个内存区域指针
* @param s2 第二个内存区域指针
* @param n 比较的字节数
* @return 差异值(<0: s1<s2, 0: 相等, >0: s1>s2
*/
int rt_memcmp(const void* s1, const void* s2, rt_size_t n);
/**
* @brief 安全内存拷贝(要求内存区域不重叠)
* @param dest 目标内存地址restrict修饰
* @param src 源内存地址restrict修饰
* @param n 拷贝的字节数
* @return 目标内存地址
*/
void* rt_memcpy(void* restrict dest, const void* restrict src, rt_size_t n);
/**
* @brief 内存区域填充
* @param s 目标内存地址
* @param c 填充字节值转换为unsigned char
* @param n 填充的字节数
* @return 原始内存地址
*/
void* rt_memset(void* dest, int val, rt_size_t n);
/** @defgroup string_operations 字符串操作 */
/**
* @brief 字符串比较
* @param s1 第一个字符串指针
* @param s2 第二个字符串指针
* @return 差异值(<0: s1<s2, 0: 相等, >0: s1>s2
*/
int rt_strcmp(const char* s1, const char* s2);
void* rt_memcpy(void* restrict dest, const void* restrict src, rt_size_t n);
void* rt_memset(void* s, int c, rt_size_t n);
/**
* @brief 计算字符串长度
* @param s 字符串指针
* @return 字符串长度(不含终止符)
*/
rt_size_t rt_strlen(const char* s);
/**
* @brief 计算字符串哈希值
* @param s 输入字符串
* @return 32位无符号哈希值
* @note 使用FNV-1a哈希算法实现
*/
u32_t rt_strhash(const char* s);
#endif // __SMCC_RT_STRING_H__

View File

@ -1,3 +1,10 @@
/**
* @file rt_api_def.h
* @brief SMCC运行时库接口定义
*
* 定义运行时基础API函数指针类型及运行时接口结构体
*/
#ifndef __SMCC_RT_API_DEF_H__
#define __SMCC_RT_API_DEF_H__
@ -5,48 +12,172 @@
#ifndef __RT_SIZE_TYPE__
#define __RT_SIZE_TYPE__
/**
* @typedef rt_size_t
* @brief 表示内存大小的类型定义
*/
typedef usz_t rt_size_t;
#endif
/**
* @typedef rt_malloc
* @brief 内存分配函数指针类型
* @param size 需要分配的内存大小
* @return 分配的内存指针失败返回NULL
*/
typedef void* (*rt_malloc)(rt_size_t size);
/**
* @typedef rt_free
* @brief 内存释放函数指针类型
* @param ptr 需要释放的内存指针
*/
typedef void (*rt_free)(void* ptr);
/**
* @typedef rt_exit
* @brief 程序退出函数指针类型
* @param code 退出状态码
*/
typedef void (*rt_exit)(int code);
/** @defgroup file_io 文件I/O相关类型 */
#ifndef __RT_FILE_TYPE__
#define __RT_FILE_TYPE__
/**
* @typedef rt_file_t
* @brief 文件句柄类型定义
*/
typedef void* rt_file_t;
#endif
/** @brief 标准输入文件句柄 */
extern rt_file_t rt_stdin;
/** @brief 标准输出文件句柄 */
extern rt_file_t rt_stdout;
/** @brief 标准错误文件句柄 */
extern rt_file_t rt_stderr;
/**
* @typedef rt_fopen_t
* @brief 文件打开函数指针类型
* @param file_name 文件名
* @param mode 打开模式同fopen
* @return 文件句柄失败返回NULL
*/
typedef rt_file_t (*rt_fopen_t)(const char* file_name, const char* mode);
typedef int (*rt_fflush_t)(rt_file_t*file);
/**
* @typedef rt_fflush_t
* @brief 文件缓冲刷新函数指针类型
* @param file 文件句柄指针
* @return 成功返回0失败返回非0值
*/
typedef int (*rt_fflush_t)(rt_file_t* file);
/**
* @typedef rt_fclose_t
* @brief 文件关闭函数指针类型
* @param file 文件句柄
* @return 成功返回0失败返回EOF
*/
typedef int (*rt_fclose_t)(rt_file_t file);
/**
* @typedef rt_fread_t
* @brief 文件读取函数指针类型
* @param dst_buf 目标缓冲区
* @param elem_size 单个元素大小
* @param count 元素数量
* @param file 文件句柄
* @return 实际读取的元素数量
*/
typedef int (*rt_fread_t)(void * dst_buf, rt_size_t elem_size, rt_size_t count, rt_file_t file);
/**
* @typedef rt_fwrite_t
* @brief 文件写入函数指针类型
* @param buf 源缓冲区
* @param size 单个元素大小
* @param count 元素数量
* @param file 文件句柄
* @return 实际写入的元素数量
*/
typedef int (*rt_fwrite_t)(const void * buf, rt_size_t size, rt_size_t count, rt_file_t file);
/** @defgroup utility 实用工具函数 */
/**
* @typedef rt_fprintf_t
* @brief 格式化输出函数指针类型
* @param file 文件句柄
* @param format 格式化字符串
* @param ... 可变参数
* @return 输出的字符数
*/
typedef int (*rt_fprintf_t)(void * file, const char *format, ...);
/**
* @typedef rt_snprintf_t
* @brief 安全格式化字符串函数指针类型
* @param stream 目标缓冲区
* @param n 缓冲区大小
* @param format 格式化字符串
* @param ... 可变参数
* @return 写入的字符数(不含终止符)
*/
typedef int (*rt_snprintf_t)(char * stream, rt_size_t n, const char * format, ...);
/**
* @typedef rt_realloc_t
* @brief 内存重分配函数指针类型
* @param memory 原内存指针
* @param new_size 新内存大小
* @return 新内存指针失败返回NULL
*/
typedef void* (*rt_realloc_t)(void *memory, rt_size_t new_size);
/**
* @struct smcc_rt_t
* @brief 运行时接口集合
*
* 包含内存管理、文件操作等核心运行时函数的指针集合
*/
typedef struct smcc_rt {
/** @brief 内存分配函数指针 */
rt_malloc _malloc;
/** @brief 内存释放函数指针 */
rt_free _free;
/** @brief 程序退出函数指针 */
rt_exit exit;
/** @brief 文件打开函数指针 */
rt_fopen_t fopen;
/** @brief 文件缓冲刷新函数指针 */
rt_fflush_t fflush;
/** @brief 文件关闭函数指针 */
rt_fclose_t fclose;
/** @brief 文件读取函数指针 */
rt_fread_t fread;
/** @brief 文件写入函数指针 */
rt_fwrite_t fwrite;
// Optional useful runtime
/** @name 可选工具函数 */
///@{
/** @brief 格式化输出函数指针(可选) */
rt_fprintf_t fprintf;
/** @brief 安全格式化字符串函数指针(可选) */
rt_snprintf_t snprintf;
/** @brief 内存重分配函数指针(可选) */
rt_realloc_t _realloc;
///@}
} smcc_rt_t;
/** @brief 全局运行时接口实例 */
extern const smcc_rt_t rt;
/** @brief 空指针定义 */
#define NULL ((void *)0)
#endif
#endif // __SMCC_RT_API_DEF_H__

View File

@ -3,4 +3,4 @@
void init_rt_std();
#endif
#endif // __SMCC_RT_STD_H__

View File

@ -1,29 +1,120 @@
/**
* @file rt_type.h
* @brief 基础类型定义
*
* 定义跨平台基础数据类型别名基于C99标准头文件<stdint.h>和<stddef.h>
*/
#ifndef __SMCC_RT_TYPE_H__
#define __SMCC_RT_TYPE_H__
#include <stddef.h>
#include <stdint.h>
/** @defgroup integer_types 整数类型 */
/**
* @typedef i8_t
* @brief 8位有符号整数
*/
typedef int8_t i8_t;
/**
* @typedef i16_t
* @brief 16位有符号整数
*/
typedef int16_t i16_t;
/**
* @typedef i32_t
* @brief 32位有符号整数
*/
typedef int32_t i32_t;
/**
* @typedef i64_t
* @brief 64位有符号整数
*/
typedef int64_t i64_t;
/**
* @typedef u8_t
* @brief 8位无符号整数
*/
typedef uint8_t u8_t;
/**
* @typedef u16_t
* @brief 16位无符号整数
*/
typedef uint16_t u16_t;
/**
* @typedef u32_t
* @brief 32位无符号整数
*/
typedef uint32_t u32_t;
/**
* @typedef u64_t
* @brief 64位无符号整数
*/
typedef uint64_t u64_t;
/** @defgroup floating_point 浮点类型 */
/**
* @typedef f32_t
* @brief 32位单精度浮点数
*/
typedef float f32_t;
/**
* @typedef f64_t
* @brief 64位双精度浮点数
*/
typedef double f64_t;
/** @defgroup pointer_types 指针类型 */
/**
* @typedef iptr_t
* @brief 带符号指针类型intptr_t别名
*/
typedef intptr_t iptr_t;
/**
* @typedef uptr_t
* @brief 无符号指针类型uintptr_t别名
*/
typedef uintptr_t uptr_t;
/** @defgroup size_types 大小类型 */
/**
* @typedef usz_t
* @brief 无符号大小类型size_t别名
*/
typedef size_t usz_t;
// /**
// * @typedef isz_t
// * @brief 带符号大小类型ssize_t别名
// */
// typedef ssize_t isz_t;
// /** @defgroup word_types 字类型 */
//
// /**
// * @typedef uw_t
// * @brief 无符号机器字类型32位
// */
// typedef u32_t uw_t;
//
// /**
// * @typedef iw_t
// * @brief 带符号机器字类型32位
// */
// typedef i32_t iw_t;
#endif
#endif // __SMCC_RT_TYPE_H__