前言

在阅读此文章前,建议先阅读我之前写的《libctemplate——C语言模块引擎简介及使用》,以便对这个库有一个初步的认识。通过对库的代码阅读,对库有了一定的认识,提练一些重要的知识点,以作记录。

原理

1、通过一系列接口函数建立字典树,属于MVC中的C,即controllor部分;接口在头文件中,主要包括

// 添加简单的变量,键值对
TMPL_varlist *TMPL_add_var(TMPL_varlist *varlist, ...); // 添加一个循环列表中值列表中
TMPL_varlist *TMPL_add_loop(TMPL_varlist *varlist, const char *name, TMPL_loop *loop); // 在循环列表中添加值列表
TMPL_loop *TMPL_add_varlist(TMPL_loop *loop, TMPL_varlist *varlist);

2、调用TMPL_write接口,把字典中的值替换模板中的变量,并输出

// 一般使用,只需要提供filename,varlist,out
int TMPL_write(const char *filename, const char *tmplstr,
const TMPL_fmtlist *fmtlist, const TMPL_varlist *varlist,
FILE *out, FILE *errout);

这个函数内部,又分几步完成

(1)把文件一次性读入缓存中

(2)解析缓存,转换为各种类型的标签(tagnode),组成一棵标签树

(3)从标签树根开始,输出各个标签的内容;需要输出标签中的变量值时就查找字典树。

显示view(标签)

libctemplate允许在模板文件(html)中使用的一些特定标签,这些特定的标签如tag_kind枚举类型定义。具体意义见注释。

 typedef enum {
tag_text = 0x001, /* text sequence */
tag_var = 0x002, /* TMPL_VAR */
tag_if = 0x004, /* TMPL_IF */
tag_elsif = 0x008, /* TMPL_ELSIF */
tag_else = 0x010, /* <TMPL_ELSE> */
tag_endif = 0x020, /* </TMPL_IF> */
tag_include = 0x040, /* TMPL_INCLUDE */
tag_loop = 0x080, /* TMPL_LOOP */
tag_break = 0x100, /* TMPL_BREAK */
tag_cont = 0x200, /* TMPL_CONTINUE */
tag_endloop = 0x400 /* </TMPL_LOOP> */
} tag_kind;

模型model(字典)

 struct TMPL_var {
TMPL_var *next; /* next simple variable on list */
const char *name;
char value[]; /* value and name stored here */
};
 struct TMPL_varlist {
TMPL_varlist *next; /* next variable list on a list */
TMPL_var *var; /* list of my simple variables */
TMPL_loop *loop; /* list of my loop variables */
TMPL_loop *parent; /* my parent loop variable (if any) */
};
 struct TMPL_loop {
TMPL_loop *next; /* next loop variable on a list */
const char *name; /* my name */
TMPL_varlist *varlist; /* list of my variable lists */
TMPL_varlist *tail; /* tail of "varlist" */
TMPL_varlist *parent; /* my parent variable list */
};

简单键值对插入

以一个简单的例子作为说明。

 // 插入姓名和年龄,所有键与值用字符串表示,以0表示结束
TMPL_varlist *mainList = ;
personList = TMPL_add_var(, "Name", "lucy", "Age", "", );
函数TMPL_add_var原型如下所示,从原型可以看出,是可变参数的
TMPL_varlist* TMPL_add_var(TMPL_varlist *varlist, ...)

执行此函数操作后,会建成一个链表,所结成的结构如下所示

libctemplate——源码分析的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

随机推荐

  1. EMCA和EMCTL的简单用法

    背景 其实这两个完全是两回事,不过倒是有关系,emca就是建立的资料库,建立后就用emctl来管理服务了.oem有问题基本都是重建emca,然后用emctl来操作. 当时用emca感觉真是一阵空白,太 ...

  2. JavaScript——封装

    封装:使用对象封装的好处是可以减少全局变量污染的机会,讲属性,函数都隶属一个对象. 封装前: <script> var name="foo"; //name是全局的,被 ...

  3. lvs持久连接及防火墙标记实现多端口绑定服务

    lvs持久连接及防火墙标记实现多端口绑定服务 LVS持久连接: PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS: PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向 ...

  4. rsa加密解密, 非对称加密

    2016年3月17日 17:21:08 星期四 现在越来越懒了.... 参考: http://www.xuebuyuan.com/1399981.html 左边是加密流程, 右边是解密流程 呃...有 ...

  5. 转载:《理解OAuth 2.0》 阮一峰

    原文:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  6. Linux中断处理(一)

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着"重要的事马上做, 不重要的事推后做"的异步处理思想. 于是整理一下~~第一阶段--获取中断号每个 ...

  7. Node.js ECONNREFUSED错误

    1 现象 node服务器 遇见此错误,如下:events.js:71throw arguments[1]; // Unhandled 'error' event^Error: connect ECON ...

  8. notepad++ 快捷键大全、notepad常用快捷键

    Notepad++ 快捷键 大全, notepad++也情有独钟,最近发现了一个快捷键,就是选中单词,ctrl+shift+enter.不过现在想知道一个快捷键,假设有三行代码,选中后一般按TAB就可 ...

  9. CentOS切换为iptables防火墙并进行相关配置

    CentOS切换为iptables防火墙 切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务. 1.关闭firewall: service firewalld s ...

  10. PHP 发送HTTP请求的几种方式

    1.curl仍然是最好的HTTP库,没有之一. 可以解决任何复杂的应用场景中的HTTP 请求2. 文件流式的HTTP请求比较适合处理简单的HTTP POST/GET请求,但不适用于复杂的HTTP请求3 ...