AQStack test code.
[reglxgmr.git] / tools / cmpl / shlib / param.shlib
bloba94f94e49ae98ff3a699301b7e20db9b30dfd897
1 #!/bin/bash
2 ############################################################
3 # source: param.shlib
4 # author: CottonCandyOwner(CottonCandyOwner@126.com)
5 # date: 2024-09-01
6 ############################################################
7 # Copyright (C) 2024- Free Software Foundation, Inc.
8 # This script is free software; the author gives unlimited permission to copy,
9 # distribute and modify it.
10 ############################################################
11 # note:
12 # this file is the supporting libarary for imi file loading.
14 ############################################################
17 ############################################################
18 # general
19 GENERAL_RE="\.*"
20 BLANK_RE="[[:blank:]]*"
21 CMNT_RE='[[:blank:]]*#.*$'
22 NL_RE='\r?\n'
24 ###########################################################
25 # share var str
26 QSTR_RE="[\']([^\']*)[\']"
27 RQSTR_RE="[\`]([^\`]*)[\`]"
28 ENVAR_RE="([\$][{(][(]?[^})]*[)]?[})])|([\$][[:alnum:]_]+)"
29 WSTR_RE="([^\`\"\'\$\(\)\r\ \n]([^\`\"\'\$\ \r\n\)]|([\\\\].))*)"
31 QWSTR_RE="([^\`\\\$\"]|([\\\\].)|\n)*"
32 DQSTR_RE="[\"]((${QWSTR_RE})|(${RQSTR_RE})|(${ENVAR_RE}))*[\"]"
34 SHSTR_RE="((${DQSTR_RE})|(${QSTR_RE})|(${ENVAR_RE})|(${RQSTR_RE})|(${WSTR_RE}))+"
38 ###########################################################
39 # var assignment
40 VASN_RE="(([[:alnum:]_:]*)[\(]?[[:alnum:]_:,]*[\)]?[[:blank:]]+)?([[:alnum:]_:^$]*([\$][\{\(][^\}\)]+[\}\)][[:alnum:]_:^\$]*)*[\x5d|\[|[:alnum:]|_|:^$]*)([+]?=)"
42 GEN_VAR_LIST="eval VNAME_LIST=\"\\\\\"\\\\\$VNAME_LIST\\\\\"\\\\\$'\\\\n'\\\\\"\$imivname\\\\\"\";"
44 VASN_OUTSTR=": \$((j++));\n i=0;\n imicmd=\"\2\";\n imicmdopt=\"\1\";\n imivname=\"\3\";\n imiopr=\"\5\";\n ${GEN_VAR_LIST}\n"
45 OUTFMT_STR="\n imivalstr=\1;\n \$vonenvset \"\$imicmd\" \"\$imicmdopt\" \"\$imivname\" \"\$imiopr\" \"\$imivalstr\" ;\n\x01"
50 ###########################################################
51 # elem
52 ELEMSTR_RE="(\[([[:alnum:]_]*)\]=)?(($SHSTR_RE)(([[:space:]]+)|($)|(${CMNT_RE})))"
53 ELEMSTR_OUTSTR="\n idx=\3;\n export \${imivname}__a_\${idx:-\$((i++))}=\5;\n"
54 ELEMEND_OUTSTR="eval \${imivname}=\"\\\\\"\\\\\${\${imivname}__a_0}\\\\\"\";\n unset \${imivname}__a_0;\n \$vonarrset \$imivname $i;\n\x01"
58 __envset ()
60 eval local vname=$3
61 local valstr="$5"
63 test "$4" = '+=' && eval $vname="\"\${$3}\$valstr\"" && return $?
64 eval $vname="\"\$valstr\""
65 return $?
68 __arrset ()
70 # pause data "__arrset $@:" >&2
74 envset ()
76 local data
77 # pause data "envset $@:" >&2
79 __envset "$@"
81 eval echo "$3=\${$3}"
84 arrset ()
86 local idx=1
87 local data
88 pause data "arrset $@:" >&2
90 __arrset "$@"
92 # todo: array display
93 while read data; do
94 eval echo "$data=\" \${$data}\""
95 done << EOF
96 $(set | sed -nE "s/^($1[[:alnum:]_]*)=.*$/\1/p")
97 EOF
100 vonenvset=__envset
101 vonarrset=__arrset
106 IMI_RE="
107 /^${CMNT_RE}/{
108 # cmnt-tag
109 s/#+[[:blank:]]*[\<](.*)[\>][[:blank:]]*:[[:blank:]]*(.*)/\n\1='\2';\n/g; Tnext1;
110 p; b;
111 :next1
112 s/#+[[:blank:]]*[\(](.*)[\)][[:blank:]]*=[[:blank:]]*(.*)/\ncmntag \1 \2;\n/g; Tnext2;
113 p; b;
114 :next2
115 s/#+(.*)$//g;
118 # s/[\r]$//g;
119 /^${BLANK_RE}[\r]?$/{ d; b; }
120 s/${VASN_RE}/${VASN_OUTSTR}=/; Tend;
121 /\n=\(/{
122 :newln;
123 s/\n=\([[:space:]]*\).*$/${ELEMEND_OUTSTR}/; telemend;
124 s/\n=\([[:space:]]*(${ELEMSTR_RE})/${ELEMSTR_OUTSTR}\n=\(/;telemproc;
125 N; bnewln;
126 :elemproc;
127 bnewln;
128 :elemend;
132 :getval;
133 s/\n=(${SHSTR_RE})(([[:space:]]+)|($)|(${CMNT_RE}))/${OUTFMT_STR}/;tproc;
134 N; bgetval;
135 :proc;
138 :end;"
140 onImiOpen ()
143 VNAME_LIST=
144 # echo "open($@)"
149 vonEvlStr="eval echo \"\${vname}_EVL=\\\"\\\${\${vname}}\\\"\" >&2"
150 vonEvl="$vonEvlStr"
151 vonEvl=
153 onImiClose ()
155 local vname=
157 echo "close($@)"
159 while read vname; do
160 test -z $vname && continue
161 eval eval "$vname=\"\\\"\${${vname}_EVL}\\\"\""
162 eval "$vonEvl"
163 done << EOF
164 $(echo "$VNAME_LIST" | sed -nE "s/^(.*)_EVL$/\1/p")
168 vonImiOpen=onImiOpen
169 vonImiClose=onImiClose
171 __iredir_open ()
173 local pid=$$
175 redir_pipe_nest_lvl=${redir_pipe_nest_lvl:-0}
176 if [[ ! -e "/tmp/fifo/$pid/$redir_pipe_nest_lvl" ]]; then
177 : $((redir_pipe_nest_lvl++))
178 mkdir -p /tmp/fifo/$pid
179 mknod /tmp/fifo/$pid/$redir_pipe_nest_lvl p
181 fpipe="/tmp/fifo/$pid/$redir_pipe_nest_lvl"
184 __iredir_close ()
186 rm $fpipe
187 fpipe=
190 cmd2pipe ()
192 test ! -p $fpipe && echo "no valid pipe ($fpipe)." && exit
193 # add prefix of timeout to avoid long time running.
194 $@ 2>/dev/null > $fpipe &
197 catfiles ()
199 for file in $@; do
200 test ! -e $file && continue
201 echo -ne "$vonImiOpen $file\n\x01"
202 cat $file | sed -nE "$IMI_RE"
203 echo -ne "$vonImiClose $file\n\x01"
204 done
207 # fsyntax: imiload <file>
208 imiload ()
210 __iredir_open 2>/dev/null
212 cmd2pipe catfiles $@ 2>/dev/null
214 vonenvset=__envset
215 vonarrset=__arrset
218 VNAME_LIST=
219 if test "$1" = "-d"; then
220 vonenvset=envset
221 vonarrset=arrset
222 shift
223 while read -d $'\x01' -r data; do
224 echo "data=$data";
225 eval "${data}"
226 # test $j = 5 && __iredir_close 2>/dev/null && return 0
227 done < $fpipe # 2>/dev/null
228 else
229 while read -d $'\x01' -r data; do
230 eval "${data}"
231 done < $fpipe # 2>/dev/null
233 __iredir_close 2>/dev/null
243 f_ttyout=$(tty)
245 vch_ttyout=125
246 eval "exec $vch_ttyout<>$f_ttyout"
248 pause ()
250 echo -ne "$2" >&vch_ttyout
252 OLD_IFS=$IFS
253 IFS=$'\n'
254 read -u $vch_ttyout -r $1
255 IFS=$OLD_IFS
256 [[ -n $3 ]] && [[ -z ${!1} || ${!1} == $'\n' ]] && $1=$3