2 ############################################################
3 # source: typedef.shlib
4 # author: devenkong(18151155@qq.com)
6 ############################################################
7 # Copyright (C) 2022- Free Software Foundation, Inc.
8 # This configure script is free software; the Free Software
9 # Foundation gives unlimited permission to copy, distribute
11 ############################################################
13 # typedef is referenced from c language. there are no
14 # conception of type in shell script, all variable is string,
15 # except few variable defined as integer. one of the weakness
16 # of shell script is variable accessing of different type,
17 # and some structured data storage and accessing is very weak.
18 # this file implement structure type defination, it orgnize
19 # different environment variable as a same object.
21 ############################################################
35 ##############################
36 # section: public comment info
37 ##############################
40 ##############################
41 # section: variable define
42 ##############################
45 ##############################
46 # section: private function
47 ##############################
51 ##############################
52 # section: public function
53 ##############################
56 # fsyntax: attr_get_var_name var
57 # fdesc: it does not process domain only, the sub-relationship can be a member,
58 # or pointer's member, or reference var's member.
66 # TBD: if there is a '@' pfx, use as an attr, or treat as a env var first.
67 if [[ "${1:0:1}" == '@' ]]; then
73 # try to match in domain list.
74 if [[ ${name:0:2} != '::' ]]; then
76 for domain
in $attr_module_domain "" $attr_curr_domain $attr_domain_list; do
77 if [[ -n $domain ]]; then
78 vname
="${domain}::$name"
79 vname
="ATTR__${vname//::/__}"
81 vname
="ATTR__${name//::/__}"
83 # dbgoutd "n.${vname}=${!vname}\n"
84 [[ -v "${vname}" ]] && echo "$vname" && return
87 # directly invoking to compactive to general using.
88 [[ -v "${name}" ]] && echo "$name" && return
90 # translate attr var name
91 # dbgoutd "name=$name\n"
93 vname
="ATTR__${vname//::/__}"
94 # dbgoutd "vname=$vname\n"
96 # dbgoutd "1.${vname}=${!vname}\n"
97 [[ -v "$vname" ]] && echo "$vname" && return
103 # fsync: type_name <tname>
104 # fdesc: get the env name of type and member with just only __T__ type.
114 [[ ${vname:0:2} == '::' ]] && vname
=${vname:2} # && return 0
116 dbgoutd
"tname=$tname\n"
117 tname
="$(attr_get_vname $tname)"
118 [[ -z $tname ]] && tname
="$1"
122 # tname="${tname//__T__/__TD__}"
123 # declare -g $opt "${tname}${vname}"
127 # fsync: type_create <tname>
128 # fdesc: create type name attr var.
134 if [[ ${name:0:2} =~
"-A" ]]; then
140 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
141 # current module domain define.
142 dbgoutd
"type_create T::${attr_module_domain}::$@\n"
143 name
="T::${attr_module_domain}::$@"
146 dbgoutd
"type_create T::$@\n"
149 attr_create
$opt "$name"
154 # TD::类型定义中的dir定义,通常是一个struct定义。
157 # TR::类型定义中的ref定义,变量中保存引用的变量或函数的类型和名称。类似于
167 # fsync: type_dir_create <tname>
168 # fdesc: delete type type define.
174 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
175 # current module domain define.
176 dbgoutd
"type_create T::${attr_module_domain}::$@\n"
177 name
="T::${attr_module_domain}::$@"
180 dbgoutd
"type_create T::$@\n"
187 # fsync: type_dir <tname> <dname>
188 # fdesc: create dir attr var in a type.
194 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
195 # current module domain define.
196 dbgoutd
"type_create T::${attr_module_domain}::$1\n"
197 name
="T::${attr_module_domain}::$1"
200 dbgoutd
"type_create T::$1\n"
203 attr_set
"$name" += "$2
208 # fsync: type_var <tname> <vname>
209 # fdesc: create var attr var in a type.
215 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
216 # current module domain define.
217 dbgoutd
"type_create T::${attr_module_domain}::$1\n"
218 name
="T::${attr_module_domain}::$1"
221 dbgoutd
"type_create T::$1\n"
224 attr_set
"$name" += "var $2
229 # fsync: type_func <tname> <fname>
230 # fdesc: create func attr var in a type.
236 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
237 # current module domain define.
238 dbgoutd
"type_create T::${attr_module_domain}::$1\n"
239 name
="T::${attr_module_domain}::$1"
242 dbgoutd
"type_create T::$1\n"
245 attr_set
"$name" += "$2
250 # fsync: type_ref <tname> <fname> <rname>
251 # fdesc: create func attr var in a type.
257 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
258 # current module domain define.
259 dbgoutd
"type_create T::${attr_module_domain}::$1\n"
260 name
="T::${attr_module_domain}::$1"
263 dbgoutd
"type_create T::$1\n"
266 attr_set
"$name" += "$2
271 # fsync: type_static_dir <tname> <dname>
272 # fdesc: create dir attr var in a type.
278 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
279 # current module domain define.
280 dbgoutd
"type_static_create T::${attr_module_domain}::$1::$2\n"
281 name
="TD::${attr_module_domain}::$1::$2"
284 dbgoutd
"type_static_create T::$1::$2\n"
291 # fsync: type_static_var <tname> <vname>
292 # fdesc: create var attr var in a type.
298 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
299 # current module domain define.
300 dbgoutd
"type_static_create T::${attr_module_domain}::$1::$2\n"
301 name
="TV::${attr_module_domain}::$1::$2"
304 dbgoutd
"type_static_create T::$1::$2\n"
311 # fsync: type_static_func <tname> <fname>
312 # fdesc: create func attr var in a type.
318 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
319 # current module domain define.
320 dbgoutd
"type_static_create T::${attr_module_domain}::$1::$2\n"
321 name
="TF::${attr_module_domain}::$1::$2"
324 dbgoutd
"type_static_create T::$1::$2\n"
331 # fsync: type_static_ref <tname> <fname> <rname>
332 # fdesc: create func attr var in a type.
338 if [[ ${name:0:2} != '::' && -n ${attr_module_domain} ]]; then
339 # current module domain define.
340 dbgoutd
"type_static_create T::${attr_module_domain}::$1::$2\n"
341 name
="TR::${attr_module_domain}::$1::$2"
344 dbgoutd
"type_static_create T::$1::$2\n"
351 # fsync: struct <sname> { ... } <tname>
352 # fdesc: create structure type.
362 # fsync: typedef struct <sname> { ... } <tname>
363 # fdesc: create var name attr var in a type.
366 if [[ "$1" == 'struct' ]]; then
369 elif [[ false
]]; then
377 # fsync: entity_define <tname> <vname>
378 # fdesc: create var entity with a type.
381 for i
in $
(attr_listofvar
$1); do
387 # fsync: entity_release <vname>
388 # fdesc: release var entity.
395 # fsync: entity_dir <ename> <dname>
396 # fdesc: append dir in a entity.
402 if [[ ${1:0:2} == "-A" ]]; then
407 tname
="$(type_name $1 $2)"
408 [[ -z $tname ]] && return
409 tname
="${tname//__T__/__VD__}"
410 declare -g $opt "${tname}"
414 # fsync: entity_var <ename> <vname>
415 # fdesc: append var in a entity.
420 if [[ ${1:0:2} == "-A" ]]; then
425 tname
="$(type_name $1 $2)"
426 [[ -z $tname ]] && return
427 tname
="${tname//__T__/__VD__}"
428 declare -g $opt "${tname}"
432 # fsync: entity_func <tname> <fname>
433 # fdesc: create func attr var in a type.
439 if [[ ${1:0:2} == "-A" ]]; then
444 tname
="$(type_name $1 $2)"
445 [[ -z $tname ]] && return
446 tname
="${tname//__T__/__TF__}"
447 declare -g $opt "${tname}"
451 # fsync: entity_ref <tname> <fname> <rname>
452 # fdesc: create func attr var in a type.
458 if [[ ${1:0:2} == "-A" ]]; then
463 tname
="$(type_name $1 $2)"
464 [[ -z $tname ]] && return
465 tname
="${tname//__T__/__TR__}"
466 declare -g $opt "${tname}"
470 # fsync: entity <sname> { .. } <vname>
471 # fdesc: it define a variable with structue.
479 ##############################
481 ##############################