SimpleTorrent
结构体 | 宏定义 | 函数
bparser.c 文件参考

B 编码 parser 的 API 实现 更多...

#include "bparser.h"
#include "util.h"
#include <string.h>
bparser.c 的引用(Include)关系图:

结构体

struct  State
 parser 状态 更多...
 

宏定义

#define DELIM   ':'
 长度与字节串的分割符
 
#define LEAD_INT   'i'
 整型结点的起始字符
 
#define LEAD_LIST   'l'
 列表结点的起始字符
 
#define LEAD_DICT   'd'
 字典结点的起始字符
 
#define END   'e'
 非串结点的终止字符
 
#define error_unexpected_char(st, ch, expect)   log("ERROR: unexpected '%c', expect '%c' at %lu", ch, expect, pos(st));
 较为常用的错误类型
 

函数

static size_t parse_get_int (struct State *st)
 从数据流中取出一个长整型 更多...
 
static char * parse_get_str (struct State *st, size_t length)
 从数据流中取出一个给定长度的字符串 更多...
 
static char parse_get_char (struct State *st)
 从数据流中取出一个字符 更多...
 
static void parse_back (struct State *st, int n)
 退回 N 个字节 更多...
 
static size_t pos (struct State *st)
 获取当前数据流位置 更多...
 
static struct BNodenew_bnode (enum BNodeType type)
 构造一个新的语法结点 更多...
 
static struct BNodeparse_bcode (struct State *st)
 解析 B 编码 更多...
 
static char * parse_bcode_is_key (struct State *st, size_t *len_o)
 解析字符串(字典键) 更多...
 
static struct BNodeparse_bcode_is_str (struct State *st)
 解析串 更多...
 
static struct BNodeparse_bcode_is_int (struct State *st)
 解析整型 更多...
 
static struct BNodeparse_bcode_is_dict (struct State *st)
 递归下降地解析字典 更多...
 
static struct BNodeparse_bcode_is_list (struct State *st)
 递归下降地解析列表 更多...
 
struct BNodebparser (char *bcode)
 解析 B 编码 更多...
 
void free_bnode (struct BNode **pbnode)
 释放 B 编码的抽象语法树 更多...
 

详细描述

B 编码 parser 的 API 实现

函数说明

struct BNode* bparser ( char *  bcode)

解析 B 编码

顶层封装,进行错误检查以及屏蔽私有结构体。

用户负责释放抽象语法树。

参数
bcode源缓冲区
返回
动态生成的语法树根结点

这是这个函数的调用关系图:

void free_bnode ( struct BNode **  pbnode)

释放 B 编码的抽象语法树

参数
pbnode指向要释放的抽象语法树的根结点

这是这个函数的调用关系图:

static struct BNode* new_bnode ( enum BNodeType  type)
static

构造一个新的语法结点

参数
type语法结点类型标签
返回
动态分配的语法结点

这是这个函数的调用关系图:

static void parse_back ( struct State st,
int  n 
)
inlinestatic

退回 N 个字节

参数
st指向状态记录
n回退字节数

这是这个函数的调用关系图:

static struct BNode * parse_bcode ( struct State st)
static

解析 B 编码

会向前看一个字节递归下降地进行解析。

参数
stparser 状态
返回
动态分配的B编码语法结点

这是这个函数的调用关系图:

static struct BNode* parse_bcode_is_dict ( struct State st)
static

递归下降地解析字典

本函数假设调用者已经消耗了字典的起始字符 'd'. 函数内部消耗终止字符 'e'.

参数
stparser 状态
返回
动态分配的字典结点

这是这个函数的调用关系图:

static struct BNode* parse_bcode_is_int ( struct State st)
static

解析整型

本函数假设调用者已经消耗了整型的起始字符 'i'. 函数内部消耗终止字符 'e'.

参数
stparser 状态
返回
动态分配的整型结点

这是这个函数的调用关系图:

static char* parse_bcode_is_key ( struct State st,
size_t *  len_o 
)
static

解析字符串(字典键)

这是解析串的子集,可以为解析串和解析字典所复用

参数
stparser 状态
len_o如果不为 NULL, 写入字符串长度
返回
动态分配的字符串

这是这个函数的调用关系图:

static struct BNode* parse_bcode_is_list ( struct State st)
static

递归下降地解析列表

本函数假设调用者已经消耗了列表的起始字符 'l'. 函数内部消耗终止字符 'e'.

参数
stparser 状态
返回
动态分配的列表结点

这是这个函数的调用关系图:

static struct BNode* parse_bcode_is_str ( struct State st)
static

解析串

与解析字符串(字典键)不同,串可以是二进制语义,要记录长度。

参数
stparser 状态
返回
动态分配的串结点

这是这个函数的调用关系图:

static char parse_get_char ( struct State st)
inlinestatic

从数据流中取出一个字符

参数
st指向状态记录
返回
取出的字符

这是这个函数的调用关系图:

static size_t parse_get_int ( struct State st)
inlinestatic

从数据流中取出一个长整型

参数
st指向状态记录
返回
返回匹配的长整型

这是这个函数的调用关系图:

static char* parse_get_str ( struct State st,
size_t  length 
)
inlinestatic

从数据流中取出一个给定长度的字符串

参数
st指向状态记录
length字符串长度(不含 '\0')
返回
动态分配的字符数组指针

这是这个函数的调用关系图:

static size_t pos ( struct State st)
inlinestatic

获取当前数据流位置

参数
st指向状态记录
返回
位置

这是这个函数的调用关系图: