文档库 最新最全的文档下载
当前位置:文档库 › eybuild

eybuild

eybuild
eybuild

eyBuild 中文手册

版本状态文件标识:eyBuild Group 当前版本:0.2.2 作 者:newzy 文件状态: [ ] 草稿 [√] 正式发布 [ ] 正在修改 完成日期:

2006-2-13

修订日志版本

日期

变更位置 变更内容 变更者 0.1.0 2006-1-22 新建 newzy 0.2.0 2006-2-6 全部 完成初版

newzy 0.2.1 2006-2-9 CSP 注释符 CSP 注释符由#改为! newzy 0.2.2 2006-2-13 头部 CSP 的解释、联系信息等 newzy

更多信息:

请访问eyBuild 的网站 https://www.wendangku.net/doc/0b17761140.html,

或发送email 到: newzy@https://www.wendangku.net/doc/0b17761140.html, , xxt@https://www.wendangku.net/doc/0b17761140.html,

目录

第1章什么是eyBuild (3)

1.1 CSP与CGI (3)

1.2 为什么要选择eyBuild开发Web站点 (4)

第2章 CSP的语法 (6)

2.1 CSP的语句 (6)

2.2 语句格式 (6)

2.3 CSP的语句行前缀符 (6)

2.4 CSP的注释前缀符(#) (8)

2.5 CSP的指令前缀符(@) (8)

2.6 CSP的require指令 (9)

2.7 CSP的输出前缀符(=) (10)

2.8 CSP的内建函数前缀符(%) (10)

2.9 在CSP中进行输出 (11)

2.10 在CSP中获取输入 (11)

2.11 CGI前缀和ROM前缀 (15)

第3章 eyBuild开发环境简介 (17)

3.1 安装eyBuild (17)

3.2 eyBuild目录结构 (17)

3.3 什么是虚目录 (19)

3.4 MAP文件 (19)

3.5 WEB2BIN (20)

3.6 CSP2BIN (21)

3.7 DONEMAP (21)

3.8 脚本的入口cgimain() (22)

第4章建立工程并生成CGI可执行文件 (24)

4.1 建立工程的一般步骤 (24)

4.2 示例 (24)

4.2.1 环境准备: (24)

4.2.2 源文件编写 (24)

4.2.3 配置翻译器 (25)

4.2.4 翻译CSP文件和ROM文件 (26)

4.2.5 创建项目编译环境 (27)

4.2.6 运行结果 (28)

第5章调试 (29)

5.1 用ebSetDebug()调试 (29)

5.2 异常中断调试 (29)

第1章什么是eyBuild

eyBuild,是 Easy Build 的简写,它是CSP(C Language Service Page)开发套件的总称。eyBuild是嵌入式设备上WEB应用的最理想的开发工具,同是也是服务器WEB应用开发最有益的补充,它包括CSP2BIN、WEB2BIN、DONEMAP、eyBuildLib等开发组件。

CSP是C Language Service Page 的缩写,它是一种基于C语言的脚本开发技术。跟ASP、JSP类似,它们都是CGI(Common Gateway Interface)的一种变种。我们可以直接在HTML 等文件中嵌入任意C语句形成CSP的源文件,然后用CSP2BIN将该文件转换成C语言的源程序。

1.1 CSP与CGI

自CGI产生以来,C语言以其高效性、灵活性和通用性一直是开发交互式WEB应用的最有吸引力的选择。但近年来,能直接内嵌于HTML文档中间的各种脚本工具,以其简便性易用性使一部分用户开始放弃了直接用C来开发CGI脚本。

但还有两类用户没有放弃用C来开发它们的应用,一是对性能追求较高的高端开发者,二是嵌入式设备的开者。前者选择C语言来开发它们的WEB应用,是因为C高效性、灵活性和通用性是各种脚本工具无法取代的。后者选择C语言,是因嵌入式设备的特点(内存、CPU等资源有限等,不可在设备上运行如ASP,PHP,PERL等的脚本的运行环境)决定的(另外,目前嵌入式设备主要以C语言开发为主)。

自CGI出现以来,就有人开发方便C语言开发的开发库cgilib,从目前的情况看cgilib 并没有得到广泛的应用;再反看下各种脚本开发工具,它们则受到WEB开发者的直接异常青睐。对比后不难发现,基于C语言的cgilib并没有从根本上解决交互式WEB应用的真正需求,这是因为直接用C语言无法像其它脚本一样嵌入在HTML文档中间,使得用输出HTML文档时非常烦琐,源代码可读性较差,维护困难。

现在用CSP来开发WEB应用程序则就不同了,你可以像ASP、JSP、PHP等工具一样在HTML文档中自由地嵌入C语言的程序代码。如果你是个C/C++或JA V A程序员,你不必重新学习任何一种新语言,即可以像高效地开发WEB应用,工作模式跟原来几乎一样。如果曾经用ASP、JSP、JSP开发过并有一定的C语言基础,你会发现CSP简单就是它们的一种变种。无需太多学习即可用CSP做开发了。

下表是一段简单的CSP代码(头文件包含不是必须的,仅用作示范),它是将一段C程序直接嵌套在HTML模板文件中:

1

2

3 <% 语句起始标签

4 # list includes files 注释行

5 @ include C 语言头文件包含

6 @ include C 语言头文件包含

7 %> 语句结束标签

8 输出:<% = “hello world
” %>输出字符串

9 也可以这样输出:

10 <%

11 ebprintf (ebfp, “%s
”, “*** hello world ***”); C 语句

12 %>

13

14

1.2 为什么要选择eyBuild开发Web站点

eyBuild 是基于CSP技术的开发套件的总称,它具有如下特点:

1.规则简单,易学易用

简单的说CSP就是直接C语句嵌入到HTML页面中,用C语言来响应请求、控

制页面的动态输出行为,并通过简单的指令来控制页面的流程。用翻译器将CSP

源文件翻译成C程序的文件。eyBuild还提供了MAP工具,通过它可以非常容易

将CSP源程序和其它非程序文件(如图片、静态HTML文件、CSS文件)集成。

2.嵌入式设备WEB应用开发的最佳选择

目前嵌入式设备上的WEB应用最主要还是C语言直接开发CGI程序。除在序言

中提到了直接用C开发CGI的诸多缺点外,直接将HTML代码用C语句输出,

不能对两都进行有效的分离,将大大降低HTML源程序和C源程序的可读性、维

护性;直接用C语言开发还必须手工对页面输出的流程进行控制,还将大大降低

了开发的效率。

eyBuild 提供的CSP翻译工具,将CSP源程序翻译成C语言源程序。开发都只要

编辑好HTML页面模板,然后在适当地方嵌入C语句即可以有效控制页面的输出;

上文提到,还可以通过指示指令对输出页面的进行控制。使得WEB界面的开发和

执行控制动作进行了有效的分离。使得嵌入式设备的WEB开发变得高效、有序。

3.服务器WEB应用开发工具的最有益补充

用eyBuild开发的WEB应用程序可与任意服务器WEB应用进行有效的接合,因

为eyBuild开发的WEB应用程序是一个独立的自治单元,它不依赖于WEB Serever

或其它脚本程序。所以你可以在其它任意脚本程序中通过URL发起eyBuild开发

程序。eyBuild最终会将源文件生成C代码,它生成的应用具有极高的执行效率。

这样,你就可以用eyBuild来开发所需要的脚本组件,以解决效率的瓶颈。

4.模板选择有了更大的灵活性

很幸运,你几乎可以以任意文本文件(如HTML、XML、JS、CSS、TXT)为模

板,在其中插入CSP语句。这一点与其它解释性脚本语言大不相同,这是因为

CSP2BIN仅从中卒取CSP语句解析翻译,而视其它的数据为普通文本。这一特性,

给CSP模板的选择大大增加了灵活性。

5.通用、高效、跨平台性

这是因为:(1)eyBuild会将CSP源文件及其它非程序文件翻译成C语言的源程序,

所以CSP天然地继承了C语言的一切特性。(2)eyBuild库的实现是完全遵循CGI1.1

标准,所以你可以在任意操作系统(支持:Windows、Linux、BSD Unix、Free BSD、

Sun Solaris、VxWorks、WinCE、uC/OS-II)上任意遵循CGI1.1标准的WEB服务器

(支持Apache,IIS,GoAhead,httpd,mini-httpd ……)下运行最终的CGI程序。6.上传文件更容易

eyBuild专为大量数据传送(如提供一般表单项同时上传文件,见“在CSP中获取输入”)提供了一个API接口。使得多个文件上传,以及上传到服务器后的文件管理更加简单。同时还为特殊应用提供了场合提供了HOOKS接口。

7.eyBuild提供了高效的运行库

eyBuild为不同操作系统平台提供了高效的运行库,可以直接在CSP中的C语句直接调用也可以在独立的C文件中调用。eyBuild运行库类似于cgilib,如获取用户输入参数、进行页面输出缓冲、处理文件上传)。

8.使得脚本程序管理更简单

eyBuild提供了模块化处理功能,即将许多相关的CGI处理页面及相关文件(如:图片、CSS、.js文件)生成到一个cgi执行文件中,并为每个处理页面或文件在cgi执行文件内部提供虚路径的映射。这样,每个最终生成的cgi文件就一个具有相关页面集合的功能单。甚至将整个站点生成在一个cgi文件中,或者作为一个独立的模块集成到其它应用程序中。这一点在站点的发布和维护有用上非常有用,应用实例见后文。

9.源程序安全保密

因为最终会将所有的CSP源文件生成C文件并最终编译成在一个二进制文件,而不像其它脚本程序一样由脚本解释器解释脚本源程序执行,所以并不存在源代码安全隐患。对源代码具有很好的保密性。

第2章CSP的语法

在CSP源文件中界于<%和%>之间的语句(可以跨越多行)都被称为CSP语句,CSP 翻译工具CSP2BIN将对<%和%>之间CSP语句进行解释。在CSP语句的任意字符都将被视为HTML源程序的语句,CSP2BIN工具一般不对其进行解析。

2.1 CSP的语句

CSP语句包括单行语句和多行语句。凡<%和%>出现在同一个自然行的CSP语句称为单行语句;凡<%和%>跨越两个或两个以上的自然行的CSP语句称为多行语句。如下所示:

单行语句输出的例子:

1 单行语句输出:<% = “hello world
” %>再输出一次<% = “hello world
” %>

多行语句输出的例子:

1 <%

2 = “这是第二行

3 = “这是第三行

4 %>

2.2 语句格式

CSP语句以行为解析单位,每一行作为一个独立的语句CSP语句行的格式如下:

CSP语句总是以上边界符“<%”为开始,以下边界符“%>”为结束。CSP语句内部每一个自然行为一个CSP语句行。CSP翻译器以CSP语句行为单位对CSP语句进行解析。每一个语句行由三部分组成:前缀符、语句体、分号。如下所示:

1 <% [前缀符] [语句体1] [;]

2 [前缀符] [语句体2] [;]

3 [前缀符] [语句体3] [;] %>

CSP 语句行中的三部分全部省略时,称为空语句。空语句用于书写时的格式控制,翻译时翻译器将跳过空语句行。

2.3 CSP的语句行前缀符

目前eyBuild对CSP的语句行前缀符定义如下:

前缀符意义

#注释,# 后的内容不作任何解释

@ 指令指示符,用于对CSP进行特殊控制,如包含头文件、包含其它CSP页面= 输出语句,计算 = 后面的函数、变量或常量的值并作为字符串进行输出

% 调用页面内建函数,如%echo, %print (两者功能相同)

$ 保留,未定义

? 保留,未定义

< 保留,未定义

> 保留,未定义

: 保留,未定义

备注:其它可打印字符视为C语句的一部分,不作为前缀符解释,如&, !, ~

说明:

1.当CSP语句行有前缀符时,行末的分号不是必须的,翻译器会跟据需要为最终果添加上必要的C语句结束符——分号(;)。

2.当CSP语句行没.有前缀符时,翻译器会将其作为C 语言的语句直接输出,且不会自动在语句最后为其加上分号。

3.类似于ASP、JSP等,CSP也可以用等进行语句输出,等号后面可以是一个常量、变量或一个函数,但是值(如函数返回的值)必须是一个字符串。

4.在CSP语句行中插入C语句时,必须注意行首字符不要跟CSP的前缀符冲突。一般地,按K&R著的The C Programming Language的C程序风格式,一般就不会与CSP语法冲突。

例1:加与不加分号:

1 <% @ include %> 语句最后不必加分号

2 <% %prv_func(“xx”, “yyy”); %> 语句最后不必加分号

3 <% %prv_func(“xx”, “yyy”); %> . .

4 <% my_func ( 语句最后不能加分号

5 parameter1, . .

6 parameter2, . .

7 parameter3 . .

8 ); 必须手工加上分号

9 %>

例2:用 = 进行输出:

1 <% {

2 char * pstr = “this is a test
”; 定义一个C变量

3 = "Build Date:" __DATE__ __TIME__ "
" 输出常

4 = pstr 输出变量

5 = cgiPrefix() 输出函数

6 } %>

2.4 CSP的注释前缀符(#)

如果CSP语句行以前缀符“#”为开头,那么该行将被作为注释处理,即忽略#后面的任何内容。当然,也可以直接用C/C++的注释:“/* xxx */”和“//”。它们的区别是,翻译器会将C/C++的注释语句写入目录C程序中去,而“#”则注释语句则不会。注释行的语句体格式如下:

# 任意内容

例1:CSP 的注释和C/C++的注释

1 <%

2 # This is CSP comment CSP 注释

3 var++; /* this is C/C++ comment */ C/C++ 语句 + 注释

4 %>

2.5 CSP的指令前缀符(@)

包含前缀符“@”的语句行,被称为指令行。指令语句可以写在CSP源文件的任意处,因为它总是在翻译阶段被处理。指令行的语句体格式如下:

指令分隔符["] 指令的值["]

1.CSP的指令定义及其意义如下:

pagesize 设置页面缓冲区的大小,默认为4K

autoflush 是否允许自动 Flush 缓冲区,默认为TRUE

mimeheader 设置页面的MIMI 头

require 指令所在处语句处插入另外一个页面

include C 语言的文件包含语句,相当于 #include

2.分隔符可以为:等号、空格、TAB,等号两边的空格或TAB将被忽略

3.指令值两边的分号是可选的,即可以输入也可以不输入,但必须成对出现。

例1:指令分隔符

1 <%

2 @pagesize = 4K 用 = 作分隔

3 @pagesize 4K 用空格或TAB分隔

4 %>

例2:指令两边的分号

1 <%

2 @ autoflush = “TRUE” 加上引号

3 @ autoflush = FALSE 不加引号

4 %>

例3:其它例子:

1 <%

2 @mimeheader = “Content-Type=html/text\n” MIME 第一句

3 @mimeheader = “Cache-Control: no-cache\n\n” 将连在上一句后面

4 @require “/demo/header.csp” 将另一页面插入在此处

5 @include 包含头文件

6 %>

2.6 CSP的require指令

require指令用于在请求处插入另外一个页面。在翻译时仅是做了一个标记,并不把请求的文件原样复制到请求处。脚本程序执行时,会根据标记将请求页面的执行结果插入到请求处。被请求页面与请求页面共用一个请求页面的缓冲区,必要时可以通过pagesize指令设置请求页面的缓冲区大小。另外,require 的最大引用深度为6级。

需要特别说明的是,require只能引用当前模块(即同一CGI脚本程序)中的已存在的页面,否则C连接器会报告找不到所需要的函数错误。

例1:用require其它CSP引用页面

1 Hello world. This is an English Version 文件:/demo/body_en.csp

2

1 你好,这是一个中文版文件:/demo/body_ch.csp

2 <添加其它内容>

1 文件:/demo/main.csp

2 <%

3 if (!strcmp(“English”, getParameter(“version”)) 获取版本类型

4 @require “/demo/body_en.csp”; 引用英文版的内容

5 else

6 @require “/demo/body_ch.csp”; 引用中文版的内容

7 %>

8

2.7 CSP的输出前缀符(=)

类似于ASP、JSP等,CSP也可以用等进行输出字符串常量、变量、和函数返回值,甚至空指针“NULL”。输出语句行的格式如下

= 任意C语句表达式[;]

例1:用输出前缀符进行输出

1 <%

2 char * pstr = “Hello world.
”; 定义并初始化C 变量

3 = “Build Date:” __DATE__ __TIME__
输出常字符串

4 = pstr 输出变量

5 = strchr(pstr, ‘w’) 输出函数返回值

6 = (TRUE==FALSE) ? “ERROR”: “RIGHT” 输出表达式的结果

7 = “

8 %>

2.8 CSP的内建函数前缀符(%)

前缀符“%”用于指示内建函数。目前支持的内建函数有:echo和print。翻译器翻译CSP源文件时会将echo或print替换成ebprintf(ebfp, fmt, …)格式输出。目的是为了兼容书写习惯,同时简化输出语句。格式参考C标准函数printf()。

1 <%

2 % echo “hello word
” 定义并初始化C 变量

3 % echo “%s”, “hello world
” 输出常字符串

4 % print “hello word
” 输出变量

5 % print “%s”, “hello world
” 输出函数返回值

6 %> 输出表达式的结果

2.9 在CSP中进行输出

从前文已经看到,这里只是做一些补充和总结:

1.直接“=”前缀符输出

2.用 %echo, %print 输出

3.直接调用eyBuildLib中库函数 ebprintf输出

注意:

无论在CSP源文件中还是在与基相关的C程序源文件中都不要直接用标准输出函数printf()等进行输出,因为它们是不会对页面进行缓冲的,当后面出现错误时,错误信息将不能正确的输出。另外它们的输出还会打乱正常的输出次序,使输出结果中的次序错误。

2.10 在CSP中获取输入

通常,客户端通过URL和表单(FORM)两种形式进行提交请求。通过URL时采用的是HTTP的GET方法,通过FORM形式提交时我们可以指定是采用GET方法还是POST 方法。在采用POST方法时,我可以通过“ENCTYPE”在表单中指明采用的编码方式为“application/x-www-form-urlencoded”或“multipart/form-data”(前者为默认的编码方式)。我们知道,在上传文件时必须采用“multipart/form-data”编码方式。

eyBuildLib提供了两类API函数,它们分别用于:

(1)从POST方法下编码方式为“multipart/form-data”的提交方式取得数据(参阅dopost()及其相关API

(2)从前者以外的提交方式中取得数据(参阅getParameter()及其相关API)

下面给出向个例子以说明如何使用它们。

例1.从URL中获得请求参数

1

2 连接到页面:

3

4 demo.csp

5

6

1

2 这是在demo.csp页面中,参数 arg1=

3 <% =getParameter(“arg1”) %>

4

5

1 这是在demo.csp页面中,参数arg1= Hello world

说明:

第一段程序用于显示在客户端,提交参数arg1=Hello+world

第二段程序为服务器端程序

第三段为当点击了客户端的超级连接后在浏览器上的输出结果

其中的“cgiPrefix(NULL) ”用于设置CGI 前缀。

例2.通过表单提交

1

2 请在输入:

3

4

1

2 你输入的是: <% =getParameter("inputbox1") %>

3

例3.从上传文件中获取输入

1

2 ENCTYPE="multipart/form-data">

3 选择文件1:

4 选择文件2:

5 上传到目录:

6

7

文件/demo/uploads.csp:

1

2 Upload Server

3

4 <%

5 @ include

6 @ include

{

POST_PARAM * p_param = NULL; THIS_POST * p_post;

int i, filecount;

char * destdir = NULL;

7 /* create post parameters:

*

* extern POST_PARAM * createPostParam

* (

* int max_post_size, /@ max post size @/

* int file_max_size, /@ max size each file @/

* int max_file_number, /@ max file may uploads @/ * char * upload_tmp_dir, /@ where to store temp @/ * int options /@ other options @/

* );

*/

8 if (NULL == (p_param=createPostParam(0, 0, 3, NULL, 0))) return ERROR;

/* done post */

if (NULL == (p_post=dopost(p_param, ebfp)) )

return ERROR;

mkdir (destdir=getParameter(“destpath”));

filecount = getPostFileCount(p_post);

for (i=0; i < filecount; i++)

{

int ret = movePostFile(p_post, i, destdir);

9 %>

10

11

12

源地址:<%% print("%s", getPostSrcFileName(p_post, i)); %>
存储到目录: <% = destdir %>
状态:<%% print("%s", (OK==ret ? "OK": "ERROR")); %>

13 <%

14

} /* end for */

distoryPost(p_post, TRUE);

p_post = NULL; p_param = NULL; } /* end */

15 %>

执行结果举例(类似于):

1

2 Upload Server

3

源地址:C:\cspc.c
存储到目录: E:/uploads
状态:OK

源地址:c:\demo.c
存储到目录: E:/uploads
状态:OK

说明:

第一段程序用于显示在客户端

第二段程序为服务器端程序

第三段为当客户端提交两个文件(cspc.c,demo.c)并指定目标目录为“E:/upload”时的输出结果

2.11 CGI前缀和ROM前缀

什么是CGI前缀和ROM前缀?

CGI前缀和ROM前缀分别是指eyBuildLib的两个API函数cgiPrefix()和romPrefix()。它们的函数原型为:

char * cgiPrefix(char * cginame);

char * romPrefix(char * cginame);

参数cginame是指可执的CGI文件的文件名。

函数cgiPrefix()和romPrefix()返回以cginame为基础构成的前缀,若cginame为NULL,则返回用自身URL构成的前缀,如(以/cgi-bin/demo.cgi中执行结果为例):

1 <% 结果

2 = cgiPrefix(NULL); demo.cgi?cgi=

3 = cgiPrefix(“/cgi-bin/test.cgi”); /cgi-bin/test.cgi?cgi=

4 = romPrefix(NULL); demo.cgi?file=

5 = romPrefix(“/cgi-bin/test.cgi”); /cgi-bin/test.cgi?file=

6 %>

为什么要用CGI前缀和ROM前缀,如何使用它们?

一般地我们会将一系列相关的CSP源程序文件、CSS文件、图片文件等编译后生成一个独立的CGI文件(或称其为一个模块)。这个模块具有很高的自治性。当我们需要引用其中的文件时,可以通过CGI/ROM前缀来引用指定模块的名称,通过前缀后面的页面名称指定其中的子文件。子文件引用本模块的子模块时,不需要指定模块名称。下面给几个例子予以说明:

设:x.cgi 是由 a.csp、b.csp两个CSP文件和一个图片文件 c.jpg 所生成。

y.cgi 是由 d.csp 和图片文件 e.jpg 两个文件组成。

例1. 在 d.csp 中引用e.jpg和a.csp、b.csp、和 c.jpg,d.csp的源程序如下:

1

2 显示图片e.jpg: /e.jpg”>

3

4 显示图片x.cgi->c.jpg: /e.jpg”>

5

6 /a.csp>转到x.cgi->a.csp

7

8 /b.csp>转到x.cgi->b.csp

9

当该客户端通过URL(类似于https://www.wendangku.net/doc/0b17761140.html,/cgi-bin/y.cgi?cgi=d.csp)取得d.csp的页面时,其结果将为:

1

2 显示图片e.jpg:

3

4 显示图片x.cgi->c.jpg:

5

6 转到x.cgi->a.csp

7

8 转到x.cgi->b.csp

9

说明:

第一段程序为工作在服务器端的CSP源程序

第二段是输出到客户端浏览器的结果,即当该客户端通过URL(类似于https://www.wendangku.net/doc/0b17761140.html,/cgi-bin/y.cgi?cgi=d.csp)取得d.csp的页面时输出的结果。

上传给出了如何通过CGI/ROM前缀取得指定的文件。其中第二行是引用当前模块中的文件,第四、六、八行引用了别的CGI模块中的文件。

注意:

以CGI前缀为开头的文件,必须为可执行的CSP文件,以ROM前缀为开头的可以是任意文件,如图片、CSS、文本文件。

在用 CGI/ROM前缀时不要忘记前面的等号,它表示将函数返回值输出在当前位置。

第3章eyBuild开发环境简介

3.1 安装eyBuild

目前eyBuild还没有针对各种开发平台的集成开发环境(IDE),不过它的安装和设置也十分简单。一般只需要如下简单的两步操作,下面以Windows环境为例:

1.将eyBuild开发包eyBuild-xx-yy-zz.tar.gz解压到一个目录,如E:\eyBuild

2.设置环境变量EYBUILD_BASE=E:\eyBuild,方法是:

A. 从菜单“开始?设置?控制面板?系统”打开系统属性对话框

B. 从“高级”选项卡上点击“环境变量”按钮

C. 可根据需要在“用户变量”或“系统变量”将EYBUILD_BASE正确添加进去

3.2 eyBuild目录结构

下面是Windows环境下安装好了的目录结构:

EYBUILD

├─bin

│ csp2bin.exe

│ donemap.bat

│ web2bin.exe

│wintar.exe

├─demo

││ cspmap.map

││ demo.bat

││ rommap.map

││

│├─csp

││main.csp

││ test.csp

││

│├─cspsrc

│││ demo_csp_maplist.c

│││ demo_rom_maplist.c

│││

││├─csp_p

│││ _demo_main_csp.c

│││ _demo_test_csp.c

│││

││└─usr

│├─img

││ face.gif

││

│└─prj

│demo.c

│demo.dsp

│demo.dsw

├─doc

│├─API

││ dopost.html

││ebfrm.html

││ ebio.html

││ ebrespond.html

││ libIndex.htm

││rtnIndex.htm

││

│└─manual

│eyBuild 用户手册.doc

├─include

│ebfrm.h

│ebio.h

│eblib.h

│ebpost.h

│ebrequest.h

│ ebrespond.h

│ itemlist.h

└─lib

eybuild.lib

从上图可以看出,本版eyBuild开发环境下包括5个主目录:

1.bin bin目录是eyBuild所有需要的工具包

2.demo 是一个示例程序

3.doc 关于eyBuild的文档

4.include C头文件所在的目录

5.lib 库文件所在的目录

说明:

1.CSP源程序可以由WEB程序员先编辑好HTML模板,再由CGI程序在模板上嵌入相关的程序

2.可以根据平台需要可自由选择C程序编译器和链接器,如gcc,VC++等均可。需要

说明的时,必须用与之平台对应的eyBuildLib库。

3.3 什么是虚目录

什么是虚目录,为什么要用虚目录?

虚拟是指在跟在CGI/ROM前缀后面的目录名,它用于区分同名的CSP或ROM文件。如<% =cgiPrefix(NULL) %>/demo/demo.csp 和<% =cgiPrefix(NULL) %>/rt/demo.csp,其中的/demo/和/rt/就是两个虚目录。因为在最后生成的CGI文件中并不存在目录,所以称它为虚目录。同时虚目录还可以有效地隐藏源文件目录的一些细节。

3.4 MAP文件

在开发工具的安装目录结构中我们注意到,demo目录下有个cspmap.map文件。这个就是一个map文件。它是项目的配置文件,用于指示哪些目录或源文件需要被翻译,翻译后它们将使用什么名字的虚目录(见上一节)。

MAP文件的语法格式:

1.解析时以行为单位,一行最多不能多于255字符

2.解析时空行和每行开头的空格、制表位被忽略

3.以“!”为开头的行被视为注释行

4.映射行格式:

(1)文件名==> 虚目录

(2)目录名==> 虚目录

5.虚目录可以省略(但“==>”不可以省略),省略时被默认为“/”

6.映射行若以目录名为开头,目录名最后必须以“\”或“/”结束

7.文件名可以包括通配置符“*”和“?”

8.“目录名==> 虚目录”表示,下面的若干行是以该目录为搜索路径,并指定的文件映射到这个虚目录下

例1.映射文件

1 ! This is comment 注释语句

2 d:/demo/csp/X.csp ==> X/ 映射文件到虚目录“X/”下

3 d:/demo/csp/Y.csp ==> /Y/ 映射文件到虚目录“/Y/”下

4 d:/demo/csp/Z.csp ==> /Z_ 映射到根“/”并加下前缀Z_

5 d:/demo/csp/AA.csp ==> / 映射到根“/”

6 d:/demo/csp/BB.csp ==> 省略时同结果上

这样,我们可以在CSP文件中这样引用它们了:<% cgiPrefix(NULL) %>/

1 备注

2 <% cgiPrefix(NULL) %>X/X.csp对应上面的第二行

3 <% cgiPrefix(NULL) %>/Y/Y.csp

4 <% cgiPrefix(NULL) %>/Z_Z.csp

5 <% cgiPrefix(NULL) %>/AA.csp

6 <% cgiPrefix(NULL) %>/BB.csp

例2.使用配符“*”或“?”

1 d:/demo/*.csp ==> /demo/ 映射扩展名为“.csp”的文件

2 d:/test/*.html ==> /demo/ 映射到同一目录

假设:

在目录d:/demo/ 中存在文件 X.jpg、Y.csp

在目录d:/test/ 中存在X.html、X.html

那么我们就可以这样用如下方法引用它们了,好像它们来自同一真实目录一样:

1 备注

2 <% romPrefix(NULL) %>/demo/X.jpg作为ROM类型文件引用

3 <% romPrefix(NULL) %>/demo/Y.csp

4 <% romPrefix(NULL) %>/demo/X.html

5 <% romPrefix(NULL) %>/demo/Y.html

例3.映射目录到虚目录

1 d:/demo/ ==> /demo/ 指明目录映射

2 X.html 列举文件

3 Y.css 列举文件

4 d:/test/ ==> /demo/ 指明目录映射

5 A.txt 列举文件

6 B.doc 列举文件

引用方法跟上面的例子一样。

3.5 WEB2BIN

工具WEB2BIN用于把map文件中所列的文件,全部翻译成C代码。将它与其它C源程序一起,用C编译器编译到最终的可执行脚本文件中去。当通过URL获取同名的文件时,脚本程序再把它原样地输出给请求的客户端程序。

这个工具很有用,是因为我们可以用它将不可执行的文件(如JPEG、GIF、CSS等)

相关文档