2 ############################################################
4 # author: CottonCandyOwner(CottonCandyOwner@126.com)
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 ############################################################
12 # this file is the supporting libarary for imi file loading.
14 ############################################################
17 ############################################################
20 BLANK_RE
="[[:blank:]]*"
21 CMNT_RE
='[[:blank:]]*#.*$'
24 ###########################################################
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 ###########################################################
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 ###########################################################
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"
63 test "$4" = '+=' && eval $vname="\"\${$3}\$valstr\"" && return $?
64 eval $vname="\"\$valstr\""
70 # pause data "__arrset $@:" >&2
77 # pause data "envset $@:" >&2
88 pause data
"arrset $@:" >&2
94 eval echo "$data=\" \${$data}\""
96 $(set | sed -nE "s/^($1[[:alnum:]_]*)=.*$/\1/p")
109 s/#+[[:blank:]]*[\<](.*)[\>][[:blank:]]*:[[:blank:]]*(.*)/\n\1='\2';\n/g; Tnext1;
112 s/#+[[:blank:]]*[\(](.*)[\)][[:blank:]]*=[[:blank:]]*(.*)/\ncmntag \1 \2;\n/g; Tnext2;
119 /^${BLANK_RE}[\r]?$/{ d; b; }
120 s/${VASN_RE}/${VASN_OUTSTR}=/; Tend;
123 s/\n=\([[:space:]]*\).*$/${ELEMEND_OUTSTR}/; telemend;
124 s/\n=\([[:space:]]*(${ELEMSTR_RE})/${ELEMSTR_OUTSTR}\n=\(/;telemproc;
133 s/\n=(${SHSTR_RE})(([[:space:]]+)|($)|(${CMNT_RE}))/${OUTFMT_STR}/;tproc;
149 vonEvlStr
="eval echo \"\${vname}_EVL=\\\"\\\${\${vname}}\\\"\" >&2"
160 test -z $vname && continue
161 eval eval "$vname=\"\\\"\${${vname}_EVL}\\\"\""
164 $(echo "$VNAME_LIST" | sed -nE "s/^(.*)_EVL$/\1/p")
169 vonImiClose
=onImiClose
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"
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 &
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"
207 # fsyntax: imiload <file>
210 __iredir_open
2>/dev
/null
212 cmd2pipe catfiles $@
2>/dev
/null
219 if test "$1" = "-d"; then
223 while read -d $
'\x01' -r data
; do
226 # test $j = 5 && __iredir_close 2>/dev/null && return 0
227 done < $fpipe # 2>/dev/null
229 while read -d $
'\x01' -r data
; do
231 done < $fpipe # 2>/dev/null
233 __iredir_close
2>/dev
/null
246 eval "exec $vch_ttyout<>$f_ttyout"
250 echo -ne "$2" >&vch_ttyout
254 read -u $vch_ttyout -r $1
256 [[ -n $3 ]] && [[ -z ${!1} ||
${!1} == $
'\n' ]] && $1=$3