前言

  首先声明此libctemplate不是Google那个ctemplate。这个库是用C语言实现的,只有一个实现文件和一个头文件。Gooogl的ctemplate是C++实现的,和线程还扯上了关系。这两个库的具体代码还没看,从介绍及例子上看,libctemplate应该比Google的那个更轻量级,在嵌入式的web开发中可能更适合。

  因为前段时间在做嵌入式设备中的web开发,使用c语言CGI方式开发web服务器端。上网查找资料时发现“C语言也能干大事之C语言开发网站教程”,因此知道libctemplate,有了这个模板引擎,再配合cgic这个库,开发起web来会方便很多。关于这个库的介绍看官方文档可能会更准确详尽。

官网:http://libctemplate.sourceforge.net/

手册:http://libctemplate.sourceforge.net/doc.html

C语言也能干大事之C语言开发网站教程:http://www.rupeng.com/Courses/Index/34

例子

  一个简单的例子,说明这个库的简单应用。例子总共分为两部分,一部分是模板文件,也就是html文件;一部分是c语言写的CGI程序。例子比较简单,代码需要分析解析的地方请看代码注释。

html代码

 <html>
<head>
<title>user</title>
</head>
<body>
姓名:<TMPL_VAR name="Name"/><br />
年龄:<TMPL_VAR name="Age"/><br/>
家族成员:
<table border=1>
<tr><td>姓名</td><td>生日</td></tr>
<TMPL_LOOP name="Persons">
<tr><td><TMPL_VAR name="Name"/></td><td><TMPL_VAR name="Age"/></td></tr>
</TMPL_LOOP>
</table>
</body>
</html>

CGI程序

 #include <stdio.h>
#include "cgic.h" // cgic库的头文件
#include "ctemplate.h" // libctemplate库的头文件 // main已经定义在cgic.c中,在main函数中会调用cgiMain
int cgiMain(int argc, char **argv)
{
TMPL_varlist *mainList = ;
TMPL_varlist *personList = ;
TMPL_loop *loop = ; // 使用cgic接口,输出文档类型
cgiHeaderContentType("text/html;charset=gbk"); // 把两个家族成员的值加到一个TMPL_loop中,用来显示在表格中
// 所有的值都必须是字符串形式
personList = TMPL_add_var(, "Name", "lucy", "Age", "", );
loop = TMPL_add_varlist(loop, personList); personList = TMPL_add_var(, "Name", "lily", "Age", "", );
loop = TMPL_add_varlist(loop, personList); // 再把这个TMPL_loop嵌到值列表中,名字是“Persons”,要与模板中的名字一样
mainList = TMPL_add_loop(mainList, "Persons", loop); // 再往值列表中加一些值
mainList = TMPL_add_var(mainList,"Name","uncle wang","Age","",); // 把值列表在模块中显示,模块文件的路径根据需要更改
TMPL_write("web/cgi-bin/user.html",,,mainList,cgiOut,cgiOut); return ;
}

布署运行

  把CGI程序加上cgic、ctemplate一起编译,把编译出来的程序和html按指定目录放置后,可以直接执行,运行结果如下。即把值列表中的值替换模板中的指定变量,生成一串html字符流。

 [/mnt/goahead]./user2
Content-type: text/html;charset=gbk <html>
<head>
<title>user</title>
</head>
<body>
姓名:xiaomin<br />
年龄:<br/>
家族成员:
<table border=>
<tr><td>姓名</td><td>生日</td></tr> <tr><td>lucy</td><td></td></tr> <tr><td>lily</td><td></td></tr> </table>
</body>
</html>
[/mnt/goahead]

  把程序和模板布署到web server对应目录中,即可在浏览器中测试。上面例子的执行结果如下图所示。

libctemplate——C语言模块引擎简介及使用的更多相关文章

  1. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  2. JST(JavaScript Trimpath)前端模板引擎简介

    JST(JavaScript Trimpath)前端模板引擎简介及应用 今天在做某系统日志列表的时候用到了这个玩意儿.刚开始只是根据别人的例子照葫芦画瓢完成了日志列表及对应详情,晚上有空了才仔细去网上 ...

  3. Activiti工作流引擎简介

    Activiti工作流引擎简介 一.概述 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活 ...

  4. 转 C语言编译过程简介

    C语言编译过程简介 C语言编译过程简介 刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C ...

  5. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

  6. 物理引擎简介——Cocos2d-x学习历程(十三)

    Box2D引擎简介 Box2D是与Cocos2d-x一起发布的一套开源物理引擎,也是Cocos2d-x游戏需要使用物理引擎时的首选.二者同样提供C++开发接口,所使用的坐标系也一致,因此Box2D与C ...

  7. MySql常用两大存储引擎简介

    MyISAM存储引擎简介 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.M ...

  8. express依赖中模块引擎的使用

    express中模块引擎的切换 4.x 示例: 如果要将默认的模块引擎切换至指定的模块引擎,用layout render.get('/',function(req,res,next){ res.ren ...

  9. 29 A Quick Guide to Go's Assembler 快速指南汇编程序:使用go语言的汇编器简介

    A Quick Guide to Go's Assembler 快速指南汇编程序:使用go语言的汇编器简介 A Quick Guide to Go's Assembler Constants Symb ...

随机推荐

  1. XPath在asp.net中查询XML -摘自网络

    .NET Framework 2.0中可以使用System.Xml.XPath命名空间下的类对XML文档进行基于路径的查询,在查询过程中需要构造类似SQL的查询字符串,该字符串遵循XPath语法.它由 ...

  2. mysql 备份与还原

    http://dev.yesky.com/281/35291281.shtml 每一种逻辑错误发生的概率都极低,但是当多种可能性叠加的时候,小概率事件就 放大成很大的安全隐患,这时候备份的必要性就凸显 ...

  3. 软件缺陷分析方法:ODC

    资料 Orthogonal Defect Classification:简要描述. ODC-5-2.pdf :详细说明了ODC对于缺陷属性分类的描述,以及具体应该怎么划分. ODC-5-2-Exten ...

  4. Uniform resource name

        A uniform resource identifier (URI) is a uniform resource locator(定位器,探测器) (URL), uniform resour ...

  5. C#中A a=new B()的意义

    A a=new B()的意义 前提:A是B的父类. A a = new B(); 或 A a; B b=new B(); a=b; 这一句的过程是这样的, 1)创建一个类A的引用a 2)创建一个类B的 ...

  6. <input type="radio" >与<input type="checkbox">值得获取

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. 【转】Eclipse上安装GIT插件EGit及使用

    http://yufenfei.iteye.com/blog/1750124 一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32 ...

  8. ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解

    这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...

  9. Javascript——初步

    1.基本概念 Javascript是一门脚本语言,它是一门解释性的语言.网页和用户之间实时.动态的进行交互. 2.特点 简单性:没有严格的数据类型.语句简单而紧凑. 安全性:仅仅能通过浏览器实现浏览和 ...

  10. 通过源码看android系列之multidex库

    我们在开发项目时,喜欢引入好多的第三方包,大大的方便了我们的开发,但同时,因为android方法总数的限制,不能超过65k,然而呢,随着我们的开发,65k最终还是会超过,所以,google就给出了这个 ...