first version.
[build-srcpkg.git] / res / Style / TmplParam / PB1.0 / src-mdl-obj-tmpl / src-c-tmpl.imi
blob76dcfd723dbb13e996e7b8d5806896db75aae365
1 #!/bin/imi -t
2 ############################################################
3 # source: src-c-tmpl.imi
4 # author: devenkong(18151155@qq.com)
5 # date: 2022-05-28
6 ############################################################
7 # note:
8 #     c语言.c源码模板文件。
9 ############################################################
12 # todo:
13 # @ @{*section}调用某个section的定义,或以@(section name)调用。
14 # @ 一些文字内容添加_$LANG的sfx,以不同的语言输出文件内容。
15 # @ 
16 # @ 
21 # code-operation
22 # @ codegen,根据catalog输出.c、.h文件,已输出的代码文件使用codesync同步更新。
23 # @ codesync,将catalog和代码框架进行同步更新。
24 # @ codesrc2hdr,将src文件的内容更新到.h文件。
25
29 #     程序的模板,对应着程序的编码风格和模块化的程序设计。
30 #     使用comment-tag,将程序划分成不同功能和用途的代码区域,便于使用非lex-gmr的程序解析代码。
31 #     程序中的inc、pub_var、pub_func,表示头文件包含、exported变量和函数,是一个程序设计时的
32 # 主要元素,在catalog中以tabed-txt文档记录,便于输出程序代码框架,简化开发。
33 #     而头文件中包含inc、pub_define、pub_var、pub_func。在输出.c/.cpp源文件的同时,根据.h的
34 # tmpl输出.h文件。
35 #     程序中的.h文件可根据.c/cpp文件的内容输出,一些内容只需在.c或.cpp文件中编写一次,同步内容到
36 # 其它文件。程序编译成lib之后,只有lib文件和.h文件,一些源码中函数说明的注释在.h文件中添加,便于
37 # 开发时参考使用。使用codesrc2hdr,只需在源代码文件编写函数,即可更新到.h文件。
38 #     
43 # @ imi文件以模块/imi文件、section、属性来组织和存储数据。
44 # @ 通常一个imi中包含相对较多个section,而一个section中包含少量的属性,imi使用于这类数据存储。
45 # @ 在一些使用场合,以包含一些属性/变量的定义为主,例如一个config文件,又包含少量与config无关的
46 #   参数用于一些应用,这时imi和win下的ini文件的功能类似。
47 # @ 与imi类似的LISP,以()包含和表示结构化的数据,以及数据的处理。但imi只用于数据的存储,和一些
48 #   应用场合的数据的表达,其中的功能函数的定义和section的调用,用于简化数据的组织和使用,不用于
49 #   程序处理。程序的编写在c程序,以及shell-script中编写。
50 # @ 
51
52
57
58 # @ 文件以setting为imi的设置section,以文件名同名的templete为main-section,
59 # @ 在templete中定义一个src文件包含的各个section。这些section在templete之下的section中定义。
60 # @ templete在文本编辑器中可对不同的section进行编辑,这样编辑时仍可以一个src文件进行编辑。
61 # @ templete以及其中定义的section中用到的属性变量,一些在当前文件中定义,一些在其它文件中定义,
62 #   在其它文件中定义的属性变量,保存到templete的external属性中。在运行templete时,external中的
63 #   属性未定义时,根据程序的设置,可输出异常提示信息。
64 # @ templete的section之间包含blank-lines,用于代码格式的美观,并可使用编辑器的设置项设置各类section
65 #   之间的blank-lines。
66 # @ 一些section的内容较固定,而一些程序feature的定义根据其它imi中的section的定义,添加到列表中的,
67 #   这类section称之为列表section。列表section的feature-item之间包含blank-lines,可设置。
68 # @ templete文件中需要使用不同位置的blank-lines,在blankLines这个section中定义,包含name和value。
69 #   属性名称以bl为pfx,在使用时以"${blFeatureSection}"使用,表示代码中各个section之间的blank-lines。
70 # @
71
73
74 # @ tmpl文件使用一个example,以<tag>标签标识一个src中的element,将tag标签的内容当一个src的feature的example,
75 #   用于输出src-XXX-lang-feature.imi中的feature的格式。同时输出一个imi文件,使用该src-XXX-lang-feature.imi
76 #   文件输出的src-code与example相同,用于imi的test。
77 # @  
78
79
80
84 # note:
85 # @ 在当前ini配置文件定义public-param,例如文件hdr分隔符字符串,没行注释的prefix。
86 # @ code-block=param-block + templete-block。解析另一个ini"代码模块描述文件"时,
87 #   source运行param-block,添加这些环境变量,并进行设置。再source运行templete-block的block模板,
88 #   对应的环境变量中保存了这个code-block的代码。这样,根据templete和"代码模块描述文件",生成了一个
89 #   block的代码。
90 # @ 一个源文件由多个block组成,各个block填充后,生成source-code。
91 # @ 以一份sample-code,从code中copy字符串,设置public-param,来生成一种src-file的ini描述文件。
92 #   生成ini文件时,指定另一个参考ini文件,程序根据参考ini文件,获取section、var、function的
93 #   内容,用于在ui上由用户进行重新设置,一些固定的值从sample-code中截取,一些非固定的值编写代码
94 #   生成函数。
95 # @ "代码模块描述文件"根据当前ini配置生成参数列表,由用户填充参数信息。该文件可以和xml文件转换,
96 #   以便于其它使用xml格式保存数据的程序,来编辑和设置参数。
97 # @ 在code-syntaxer时,不以source运行一个section。以section对应的文本解析函数进行解析。
98 #   所以一种源文件格式,对应一个ini"源文件格式描述文件",和对应的代码处理函数的shlib。用于使用
99 #   "代码模块描述文件"生成源代码、code-syntaxer、code-comment-doc、code-info-getting。
100 # @ 对已有的src-file的某个block进行解析,逐个block调整代码,使得代码的格式可使用命令行程序进行
101 #   解析。
102 # @ 常用的file-hdr、inclist、namelist、symbollist、varlist、funclist、func-comment作为
103 #   通用的功能。
104 # @ 定义源文件的词法和语法,用于已有代码的解析。
107 # @ 一些已定义的源文件描述文件,以及某种code-style对应的配置文件等资源,可使用命令行程序,将资源
108 #   文件放置到存储空间,使用者可使用命令行程序浏览到各种已定义的文件,并可像pkg软件一样使用这些
109 #   配置文件。
111 # @ pkg-configer、pkg-builder、prj-builder、mod-builder
112 # @ tagdoc、code-syntaxer、scripttest、*xxx*unit
117 # 代码格式设置的参数文件
118 # "#","//","/*","*/",表示注释
119 # [],表示一个section,section名称字符串以"-"连接单词,与括号之间插入一个空格。
120 # 变量的定义与shell-script相同,名称的单词之间以"_"连接。
121 # <>表示目录结构的id
122 # "",'',表示一个字符串,包括"和'字符。
123 # ()表示一个数组,并且可多行显示。
124 # {}表示一个结构体描述,用于dstruct/dvar的结构化数据的赋值。
125 # =表示tag和value字符串的对应关系,通常是一个属性的赋值操作。
126 # +=表示字符串的累加,等同于shell中的+=
130 # [ <module>::<type>::<name> ]
131 # [ <type>::<name> ]
132 # [ <name> ]
133 # global var=abc
134 # strfmt(eEt) tmpl_str_fmt="@{var}"
135 # strfmt tmpl_str_fmt="@{var}"
136 # var2=aaa
137 # var2+=bbb
138 # [ setting ]
139 # DEFAULT_ATTR_PROC="global"
140 # eval IMINAME_FMT="${IMIFILE%.*}"
141 # STRFMT_EVALN="eval"
142 # STRFMT_TRANS="e"
152 [ setting ]
153 DEFAULT_ATTR_PROC="global"
154 eval IMINAME_FMT="${IMIFILE%.*}"
155 STRFMT_EVALN="eval"
156 STRFMT_TRANS="e"
158 loadimi file="shlib-lite/c-lang/c-lang-feature.imi"
159 DEFAULT_ATTR_PROC="attr"
162 [ templete ]
166 # 一些环境变量,用于templete的参数,在当前文件load之前定义。
168 # 定义编程语言类型,用于itemlist使用的tmpl的编程语言作用域pfx
169 LANG=C
170 # section之间的空行数
171 section_blanks_cnt=3
174 # comment elements
175 # 使用注释元素,使不同编程语言使用相同的comment-templete。
177 cmt2_begin="/*"                # block注释的begin符号组合
178 cmt2_end="*/"                  # block注释的end符号组合
179 cmt_blank=" "                  # 在block注释的begin和end行之间的注释,行首的空格符号。
180 cmt_pfx="*"                    # 在block注释的begin和end行之间的注释,行首的空格符号之后的符号,不包含一个空格。
181 cmt_bar_fmt="$(rptstr * @{1})" # 在block注释的begin和end行之间的注释中,用于划分code区域,使程序根据注释长条,
182                                # 划分为不同的区域。
183                                                            # section-seperator以30个符号的bar进行分隔
184                                                            # 函数体以50个符号的bar进行分隔
185                                                            # 文件hdr使用80个符号的bar进行分隔
186 #******************************
187 #**************************************************
188 #********************************************************************************
191 section_blanks_fmt='@(rptstr "
192 " $section_blanks_cnt)'
193 # 一个sectionhdr包含两个表示section的comment,一个是cmt_stub,简短,用于code partition,
194 # 一个内容较长,用于humen-readable-section,代码更美观。
195 section="@{cmt2_begin} <section:@{1}> @{cmt2_end}
196 @{cmt2_begin}@{cmt_bar 30}
197 @{cmt_blank}@{cmt_pfx} Section @{1}
198 @{cmt_blank}@{cmt_bar 30}@{cmt2_end}"
202 # 用于itemlist的templete
203 # 包括:inc、var、func
205 inc="#include <@{1}.@{2}> # ${3}"
206 pub_var="@{CMT::var::syntax}
207 @{$LANG::var::syntax}"
208 pub_func="@{CMT::func::syntax}
209 @{$LANG::func::syntax}"
212 # 各个section的tmpl
213 # itemlist根据catalog或imi中curr_<xxx>_list的定义,在运行时输出内容。
215 file_hdr="@{cmt2_begin}@{cmt_bar 80}
216 @{cmt_blank}@{cmt_pfx} Section @{1}
217 @{cmt_blank}@{cmt_bar 80}@{cmt2_end}"
218 inc_list="
219 @(itemlist inc)
222 # private的定义在编码时使用,不使用itemlist
223 pri_var_typedef="
224 @{cmt2_begin}@{cmt_bar 50}
225 @{cmt_blank}@{cmt_pfx} TODO: Replace private var & typedef code here.
226 @{cmt_blank}@{cmt_bar 50}@{cmt2_end}
228 pub_var_list="
229 @(itemlist pub_var)
232 pri_func="
233 @{cmt2_begin}@{cmt_bar 50}
234 @{cmt_blank}@{cmt_pfx} TODO: Replace private function code here.
235 @{cmt_blank}@{cmt_bar 50}@{cmt2_end}
237 pub_func_list="
238 @(itemlist pub_func)
243 # c-src文件包含几个section的组合,
245 syntax[section_src_hdr]="@{section file_hdr}"
246 syntax[file_hdr]="@{file_hdr}"
247 syntax[section_inc]="@{section inc}"
248 syntax[inc_list]="@{inc_list}"
249 syntax[section_pri_var_typedef]="@{section pri_var_typedef}"
250 syntax[pri_var_typedef]="@{pri_var_typedef}"
251 syntax[section_pub_var]="@{section pub_var}"
252 syntax[pub_var_list]="@{pub_var_list}"
253 syntax[section_pri_func]="@{section pri_func}"
254 syntax[pri_func]="@{pri_func}"
255 syntax[section_pub_func]="@{section pub_func}"
256 syntax[pub_func_list]="@{pub_func_list}"
257 syntax[section_end_code]="@{section end_code}"
259 syntax="@{syntax[section_src_hdr]}
260 @{syntax[src_hdr]}
261 @{section_blanks}
262 @{syntax[section_inc]}
263 @{syntax[inc_list]}
264 @{section_blanks}
265 @{syntax[section_pri_var_typedef]}
266 @{syntax[pri_var_typedef]}
267 @{section_blanks}
268 @{syntax[section_pub_var]}
269 @{syntax[pub_var_list]}
270 @{section_blanks}
271 @{syntax[section_pri_func]}
272 @{syntax[pri_func]}
273 @{section_blanks}
274 @{syntax[section_pub_func]}
275 @{syntax[pub_func_list]}
276 @{section_blanks}
277 @{syntax[section_end_code]}
278 @{section_blanks}"