Ver1.0 && address and alignment support && better console log
This commit is contained in:
parent
e8ec3b1530
commit
6d7f030f03
@ -1,34 +1,33 @@
|
||||
#ifndef __CONFIG_HPP__
|
||||
#define __CONFIG_HPP__
|
||||
|
||||
#define VARIABLE_NAME_LENGTH_MAX 100
|
||||
#define ELEMENT_NAME_LENGTH_MAX 100
|
||||
#define TYPE_NAME_LENGTH_MAX 100
|
||||
#define ADDR_ALIGNMENT_SIZE 4 // 地址对齐方式
|
||||
|
||||
#define A2L_TYPE_STR_LENGTH_MAX 100
|
||||
#define A2L_LIMIT_STR_LENGTH_MAX 100
|
||||
#define VARIABLE_NAME_STR_LENGTH_MAX 100 // 名称字符串最大长度
|
||||
|
||||
#define SEGMENT_BUFF_LENGTH 5000
|
||||
#define A2L_TYPE_STR_LENGTH_MAX 100 // A2L类型字符串最大长度
|
||||
#define A2L_LIMIT_STR_LENGTH_MAX 100 // A2L限制字符串最大长度
|
||||
|
||||
#define SEGMENT_BUFF_LENGTH 5000 // 段缓冲区长度
|
||||
|
||||
// 输出文件默认前缀
|
||||
#define OUTPUT_A2L_DEFAULT_PREFIX "[NEW]"
|
||||
#define OUTPUT_A2L_PREFIX "[NEW]"
|
||||
// 中间件尾缀
|
||||
#define OUTPUT_MIDDLEWARE_SUFFIX ".middleware.txt"
|
||||
// 中间件默认名称
|
||||
#define OUTPUT_DEFAULT_MIDDLEWARE_FILE_NAME "Middleware.txt"
|
||||
|
||||
// 相关识别串
|
||||
const char measurement_begin[] = "/*Start_Measurements*/";
|
||||
const char measurement_end[] = "/*End_Measurements*/";
|
||||
const char calibration_begin[] = "/*Start_Calibration*/";
|
||||
const char calibration_end[] = "/*End_Calibration*/";
|
||||
const char typedef_begin[] = "/*Start_TypeDef*/";
|
||||
const char typedef_end[] = "/*End_TypeDef*/";
|
||||
#define START_OF_MEASURMENT_PATTERN_STR "/*start_of_measurements*/"
|
||||
#define END_OF_MEASURMENT_PATTERN_STR "/*end_of_measurements*/"
|
||||
#define START_OF_CALIBRATION_PATTERN_STR "/*start_of_calibrations*/"
|
||||
#define END_OF_CALIBRATION_PATTERN_STR "/*end_of_calibrations*/"
|
||||
|
||||
const char a2l_module_end[] = "/end MODULE";
|
||||
// A2L 插入识别串
|
||||
#define A2L_INSERT_PATTERN_STR "/end MODULE"
|
||||
|
||||
// 段输出标识串
|
||||
const char auto_generated_measurement_start[] = "\r\n/*********** Start of auto generated measurement blocks ***********/\r\n\r\n";
|
||||
const char auto_generated_measurement_end[] = "\r\n/*********** End of auto generated measurement blocks ***********/\r\n\r\n";
|
||||
const char auto_generated_calibration_start[] = "\r\n/*********** Start of auto generated calibration blocks ***********/\r\n\r\n";
|
||||
const char auto_generated_calibration_end[] = "\r\n/*********** End of auto generated calibration blocks ***********/\r\n\r\n";
|
||||
#define START_OF_GENERATED_PATTERN_STR "/*********** start of SrcToA2L generated blocks ***********/"
|
||||
#define END_OF_GENERATED_PATTERN_STR "/*********** end of SrcToA2L generated blocks ***********/"
|
||||
|
||||
#endif
|
@ -13,8 +13,8 @@ extern type_node *type_list_head;
|
||||
// 宏定义列表
|
||||
extern define_node *define_list_head;
|
||||
|
||||
// 源文件列表
|
||||
extern file_node *source_file_list_head;
|
||||
// 源文件及头文件列表
|
||||
extern file_node *source_and_header_file_list_head;
|
||||
|
||||
// 文件指针
|
||||
extern FILE *input_reference_A2L_file;
|
||||
|
@ -9,34 +9,43 @@ extern "C"
|
||||
|
||||
#include "Type_Descriptions.hpp"
|
||||
|
||||
// 读取文件一行行
|
||||
error_type_enum f_getline(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
|
||||
// 读取文件一行
|
||||
size_t f_getline(FILE *file, char *buffer, const size_t buffer_len);
|
||||
|
||||
// 读取下一个有效词组
|
||||
error_type_enum f_getword(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
|
||||
size_t f_getword(FILE *file, char *buffer, const size_t buffer_len);
|
||||
|
||||
// 获取文件代码行(以;为分界的代码逻辑行,忽略中途的注释)
|
||||
error_type_enum f_get_codeline(FILE *file, char *buffer, const size_t buffer_len, size_t *seek_len = nullptr);
|
||||
size_t f_get_codeline(FILE *file, char *buffer, const size_t buffer_len);
|
||||
|
||||
// 前进到下一行
|
||||
size_t f_seek_nextline(FILE *file);
|
||||
|
||||
// 跳转到下一个非空字符
|
||||
size_t f_seek_skip_blank(FILE *file);
|
||||
size_t f_seek_skip_blanks(FILE *file);
|
||||
|
||||
// 基础变量类型解析
|
||||
variable_type_enum get_variable_base_type(const char *str);
|
||||
|
||||
// 基础变量解析
|
||||
variable_info solve_base_variable(const char *str);
|
||||
// 跳过注释和空白内容(不跳过识别段)
|
||||
size_t f_seek_skip_comments_and_blanks(FILE *file);
|
||||
|
||||
// 解析变量类型
|
||||
variable_type_enum get_variable_type(const char *str);
|
||||
variable_type_enum solve_variable_type(const char *type_str);
|
||||
|
||||
// 变量解析
|
||||
variable_info solve_variable(const char *str);
|
||||
variable_info solve_variable_info(const char *code_line_str);
|
||||
|
||||
// 获取变量地址
|
||||
uint32_t get_variable_addr32(const char *v_name_str);
|
||||
|
||||
// 输出标定量
|
||||
void f_print_calibration(FILE *file, variable_info v_info);
|
||||
|
||||
// 输出观测量
|
||||
void f_print_measurement(FILE *file, variable_info v_info);
|
||||
|
||||
// 日志输出
|
||||
void print_log(log_type_enum log_type, const char *p_format_str, ...);
|
||||
void log_printf(log_type_enum log_type, const char *p_format_str, ...);
|
||||
|
||||
// 清理和退出
|
||||
void clean_and_exit(int exit_code);
|
||||
|
||||
#endif
|
@ -9,83 +9,67 @@ extern "C"
|
||||
#include "Config.hpp"
|
||||
|
||||
// 宏定义链表
|
||||
typedef struct define_node_struct
|
||||
typedef struct define_list_node_struct
|
||||
{
|
||||
char define_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // define 名串
|
||||
char context_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // define 内容串
|
||||
define_node_struct *p_next = nullptr;
|
||||
char define_str[VARIABLE_NAME_STR_LENGTH_MAX] = {'\0'}; // define 名串
|
||||
unsigned int value = 0;
|
||||
define_list_node_struct *p_next = nullptr;
|
||||
} define_node;
|
||||
|
||||
// 文件链表
|
||||
typedef struct file_node_struct
|
||||
typedef struct file_list_node_struct
|
||||
{
|
||||
char *file_name_str = nullptr;
|
||||
file_node_struct *p_next = nullptr;
|
||||
file_list_node_struct *p_next = nullptr;
|
||||
} file_node;
|
||||
|
||||
// 错误类型枚举
|
||||
typedef enum
|
||||
{
|
||||
ERROR_NONE, // 无错误
|
||||
ERROR_OUT_OF_LENGTH, // 超出长度
|
||||
ERROR_ILLEGAL_POINTER, // 非法指针
|
||||
ERROR_ILLEGAL_WORD_SECTION, // 非法词段
|
||||
ERROR_END_OF_FILE, // 文件结尾
|
||||
} error_type_enum;
|
||||
|
||||
// 变量类型枚举
|
||||
typedef enum
|
||||
{
|
||||
TYPE_UNKNOWN, // 未知类型
|
||||
TYPE_NOT_SUPPORTED, // 不支持的类型
|
||||
STRUCTURE, // 结构体类型
|
||||
UBYTE, // uint8_t,bool
|
||||
UWORD, // uint16_t
|
||||
ULONG, // uint32_t
|
||||
SBYTE, // int8_t
|
||||
SWORD, // int16_t
|
||||
SLONG, // int32_t
|
||||
FLOAT32, // float
|
||||
FLOAT64, // double
|
||||
TYPE_UNKNOWN, // 未知类型或不支持类型
|
||||
STRUCTURE, // 结构体类型
|
||||
UBYTE, // uint8_t,bool
|
||||
UWORD, // uint16_t
|
||||
ULONG, // uint32_t
|
||||
SBYTE, // int8_t
|
||||
SWORD, // int16_t
|
||||
SLONG, // int32_t
|
||||
FLOAT32, // float
|
||||
FLOAT64, // double
|
||||
} variable_type_enum;
|
||||
|
||||
// 变量信息结构体
|
||||
typedef struct
|
||||
{
|
||||
char name_str[VARIABLE_NAME_LENGTH_MAX] = {'\0'}; // 变量名
|
||||
const char *type_name_str = nullptr; // 变量类型字符串
|
||||
size_t element_count = 0; // 子元素计数(仅数组>1,单个变量该值为1)
|
||||
size_t single_element_size = 0; // 单个子元素大小(单位字节)
|
||||
uint32_t start_addr_32 = 0x00000000; // 变量起始地址(32位地址,4字节)
|
||||
variable_type_enum type = TYPE_NOT_SUPPORTED; // 变量类型
|
||||
char A2L_type_str[A2L_TYPE_STR_LENGTH_MAX] = {'\0'}; // 类型字符串
|
||||
char A2L_max_limit_str[A2L_LIMIT_STR_LENGTH_MAX] = {'\0'}; // 上限字符串
|
||||
char A2L_min_limit_str[A2L_LIMIT_STR_LENGTH_MAX] = {'\0'}; // 下限字符串
|
||||
char name_str[VARIABLE_NAME_STR_LENGTH_MAX] = {'\0'}; // 变量名
|
||||
char type_name_str[VARIABLE_NAME_STR_LENGTH_MAX] = {'\0'}; // 类型名串
|
||||
size_t element_count = 0; // 子元素计数(仅数组>1,单个变量该值为1,未解析或解析失败为0)
|
||||
variable_type_enum type = TYPE_UNKNOWN; // 变量类型
|
||||
} variable_info;
|
||||
|
||||
// 元素信息记录链表
|
||||
typedef struct sub_element_node_struct
|
||||
typedef struct sub_element_list_node_struct
|
||||
{
|
||||
variable_info element_info; // 元素信息
|
||||
struct sub_element_node_struct *p_next = nullptr; // 链表指针
|
||||
variable_info element_info; // 元素信息
|
||||
struct sub_element_list_node_struct *p_next = nullptr; // 链表指针
|
||||
} sub_element_node;
|
||||
|
||||
// 复合类型记录链表
|
||||
typedef struct type_node_struct
|
||||
typedef struct type_list_node_struct
|
||||
{
|
||||
char type_name_str[TYPE_NAME_LENGTH_MAX] = {'\0'}; // 类型名
|
||||
sub_element_node *element_list_head = nullptr; // 子成员链表
|
||||
variable_type_enum type = TYPE_UNKNOWN; // 类型标记
|
||||
struct type_node_struct *p_next = nullptr; // 链表指针
|
||||
char type_name_str[VARIABLE_NAME_STR_LENGTH_MAX] = {'\0'}; // 类型名
|
||||
sub_element_node *element_list_head = nullptr; // 子成员链表
|
||||
variable_type_enum type = TYPE_UNKNOWN; // 类型标记
|
||||
struct type_list_node_struct *p_next = nullptr; // 链表指针
|
||||
} type_node;
|
||||
|
||||
// 日志类型记录
|
||||
typedef enum
|
||||
{
|
||||
LOG_NORMAL, // 常规类型
|
||||
LOG_SUCCESS, // 成功类型
|
||||
LOG_FAILURE, // 失败类型
|
||||
LOG_ERROR, // 错误类型
|
||||
LOG_WARN, // 警告类型
|
||||
LOG_INFO, // 常规信息类型
|
||||
LOG_SYS_INFO, // 系统消息类型
|
||||
LOG_SUCCESS, // 成功类型
|
||||
LOG_FAILURE, // 失败类型
|
||||
LOG_WARN, // 警告类型
|
||||
} log_type_enum;
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -11,8 +11,8 @@ type_node *type_list_head = nullptr;
|
||||
// 宏定义列表
|
||||
define_node *define_list_head = nullptr;
|
||||
|
||||
// 源文件列表
|
||||
file_node *source_file_list_head = nullptr;
|
||||
// 源文件及头文件列表
|
||||
file_node *source_and_header_file_list_head = nullptr;
|
||||
|
||||
// 文件列表
|
||||
FILE *input_reference_A2L_file = nullptr;
|
||||
|
31
Src/Main.cpp
31
Src/Main.cpp
@ -13,25 +13,42 @@ extern "C"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
printf("\n\n");
|
||||
log_printf(LOG_SYS_INFO, "SrcToA2L Ver1.0");
|
||||
log_printf(LOG_SYS_INFO, "Auther: LuChiChick");
|
||||
log_printf(LOG_SYS_INFO, "%s\n%s\n%s\n\n", "Open source links:",
|
||||
" ├─Github: https://git.luchichick.cn/LuChiChick/SrcToA2L",
|
||||
" └─Personal Git System: https://git.luchichick.cn/LuChiChick/SrcToA2L");
|
||||
|
||||
log_printf(LOG_SYS_INFO, "Start argument solve.\n\n");
|
||||
|
||||
// 处理输入部分
|
||||
solve_args(argc, argv);
|
||||
|
||||
printf("\n\n");
|
||||
|
||||
// 进行宏定义解析
|
||||
printf("\n\n");
|
||||
log_printf(LOG_SYS_INFO, "Start constant value definition solve.\n\n");
|
||||
solve_defines();
|
||||
|
||||
printf("\n\n");
|
||||
|
||||
// 进行类型解析
|
||||
printf("\n\n");
|
||||
log_printf(LOG_SYS_INFO, "Start compound type definition solve.\n\n");
|
||||
solve_types();
|
||||
|
||||
// 处理中间件
|
||||
printf("\n\n");
|
||||
log_printf(LOG_SYS_INFO, "Start calibration and measurement solve.\n\n");
|
||||
solve_middleware();
|
||||
|
||||
// 处理最终输出
|
||||
solve_A2L_output();
|
||||
if (input_reference_A2L_file != nullptr)
|
||||
{
|
||||
printf("\n\n");
|
||||
log_printf(LOG_SYS_INFO, "Start merging middleware into reference A2L file.\n\n");
|
||||
solve_A2L_output();
|
||||
}
|
||||
|
||||
print_log(LOG_SUCCESS, "Done.\nVer0.3");
|
||||
log_printf(LOG_SYS_INFO, "Done.");
|
||||
clean_and_exit(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user