summaryrefslogtreecommitdiff
path: root/test/profile5.awk
diff options
context:
space:
mode:
Diffstat (limited to 'test/profile5.awk')
-rw-r--r--test/profile5.awk5179
1 files changed, 5179 insertions, 0 deletions
diff --git a/test/profile5.awk b/test/profile5.awk
new file mode 100644
index 00000000..4e962b4b
--- /dev/null
+++ b/test/profile5.awk
@@ -0,0 +1,5179 @@
+
+
+
+
+
+
+BEGIN{ _addlib("_BASE") } ##########################################################
+
+func _BASE(c,t,P, A) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ if ( match(t,/^((--([Vv])ersion)|(-([Vv])))[ \t]*/,A) ) { t=substr(t,RLENGTH+1); _cmdln_version=A[3] A[5] }
+ else if ( match(t,/^((-?\?)|(--help))[ \t]*/) ) { t=substr(t,RLENGTH+1); _cmdln_help=1 }
+ else if ( match(t,/^--[ \t]*/) ) return _endpass(substr(t,RLENGTH+1))
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ if ( _cmdln_help ) { match(_fbaccr(_LIBAPI,"_lib_HELP"),/^([^\x00]*)\x00([^\x01]*)\x01(.*)/,A)
+ _out(A[2] A[1] A[3]); return _endpass(_basexit_fl=1) }
+ if ( _cmdln_version ) { _out( _ln(_PRODUCT_NAME " v" _PRODUCT_VERSION) _ln(_PRODUCT_COPYRIGHT) _ln() (_cmdln_version=="v" ? "" : _lib_NAMEVER())); return _endpass(_basexit_fl=1) }
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return "\x00" _ln(_PRODUCT_NAME " v" _PRODUCT_VERSION) _ln(_PRODUCT_COPYRIGHT) _ln() _ln(" Usage:") _ln() _ln(" " _PRODUCT_FILENAME " [/key1 /key2...] [-- cmdline]") _ln() _ln(" keys:") _ln() "\x01" _ln(" -v -V --version - output product version and (if /V) all modules") _ln(" ? -? --help - output this help page") _ln(" -- - command line string edge")
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_BASE 3.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#_____________________________________________________________________________
+func _addlib(f) { ###########################################################
+ _addf(_LIBAPI,f) }
+#_______________________________________________________________________
+func _lib_CMDLN(t) {
+ return _pass(_LIBAPI["F"],"_lib_CMDLN",t) }
+#_________________________________________________________________
+func _lib_APPLY() {
+ return _ffaccr(_LIBAPI,"_lib_APPLY") }
+#_________________________________________________________________
+func _lib_HELP() {
+ return _fbaccr(_LIBAPI,"_lib_HELP") }
+#_________________________________________________________________
+func _lib_NAMEVER() {
+ return _fbaccr(_LIBAPI,"_lib_NAMEVER") }
+#_________________________________________________________________
+func _lib_BEGIN(A) {
+ return _ffaccr(_LIBAPI,"_lib_BEGIN","",A) }
+#_________________________________________________________________
+func _lib_END(A) {
+ return _ffaccr(_LIBAPI,"_lib_END","",A) }
+#___________________________________________________________________________________
+BEGIN { ############################################################################
+
+ BINMODE="rw"
+ SUBSEP="\x00"
+ _NULARR[""]; delete _NULARR[""]
+ _INITBASE() }
+#_____________________________________________________________________________
+END { ########################################################################
+
+ _EXIT() }
+
+
+BEGIN { _addlib("_sYS") } ################################################################
+#_____________________________________________________________________________
+func _sYS(c,t,P, a,A) { #####################################################
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN": return t
+ #_____________________________________________________
+ case "_lib_APPLY": return
+ #_____________________________________________________
+ case "_lib_HELP": return
+ #_____________________________________________________
+ case "_lib_NAMEVER": return
+ #_____________________________________________________
+ case "_lib_BEGIN": return
+ #_____________________________________________________
+ case "_lib_END": return } }
+
+BEGIN { _addlib("_rEG") } ################################################################
+#_____________________________________________________________________________
+func _rEG(c,t,P, a,A) { #####################################################
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN": return t
+ #_____________________________________________________
+ case "_lib_APPLY": return
+ #_____________________________________________________
+ case "_lib_HELP": return
+ #_____________________________________________________
+ case "_lib_NAMEVER": return _ln("_reg 0.001")
+ #_____________________________________________________
+ case "_lib_BEGIN": return
+ #_____________________________________________________
+ case "_lib_END": return } }
+
+
+
+
+
+BEGIN { _addlib("_INSTRUC") } ######################################################
+
+func _INSTRUC(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_INSTRUC 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+ _delay_perfmsdelay =11500 }
+
+
+
+
+
+
+BEGIN { _addlib("_ARR") } ##########################################################
+
+func _ARR(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_ARR 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN{ } ###########################################################################
+
+
+
+
+
+
+BEGIN { _addlib("_EXTFN") } ########################################################
+
+func _EXTFN(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_EXTFN 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+ delete _XCHR; delete _ASC; delete _CHR; t=""
+ for ( i=0; i<256; i++ ) { _ASC[a=_CHR[i]=sprintf("%c",i)]=i; _QASC[a]=sprintf("%.3o",i)
+ _XCHR[_CHR[i]]=sprintf("%c", (i<128 ? i+128 : i-128)) }
+#_____________________________________________________________________________
+
+ for ( i=0; i<256; i++ ) {
+ _QSTRQ[_CHR[i]]="\\" sprintf("%.3o",i) }
+#_______________________________________________________________________
+
+ for ( i=0; i<32; i++ ) {
+ _QSTR[_CHR[i]]=_QSTRQ[_CHR[i]] }
+ for ( ; i<128; i++ ) {
+ _QSTR[_CHR[i]]=_CHR[i] }
+ for ( ; i<256; i++ ) {
+ _QSTR[_CHR[i]]=_QSTRQ[_CHR[i]] }
+ _QSTR["\\"]="\\\\" #; _QSTR["\""]="\\\""
+#_____________________________________________________________________________
+
+ _CHR["CR"] ="\015"
+ _CHR["EOL"] ="\015\012"
+ _CHR["EOF"] ="\032"
+
+ _QSTR[_CHR["EOL"]] ="\\015\\012"
+#_______________________________________________________________________
+
+ _CHR["MONTH"][_CHR["MONTH"]["Jan"]="01"]="Jan"
+ _CHR["MONTH"][_CHR["MONTH"]["Feb"]="02"]="Feb"
+ _CHR["MONTH"][_CHR["MONTH"]["Mar"]="03"]="Mar"
+ _CHR["MONTH"][_CHR["MONTH"]["Apr"]="04"]="Apr"
+ _CHR["MONTH"][_CHR["MONTH"]["May"]="05"]="May"
+ _CHR["MONTH"][_CHR["MONTH"]["Jun"]="06"]="Jun"
+ _CHR["MONTH"][_CHR["MONTH"]["Jul"]="07"]="Jul"
+ _CHR["MONTH"][_CHR["MONTH"]["Aug"]="08"]="Aug"
+ _CHR["MONTH"][_CHR["MONTH"]["Sep"]="09"]="Sep"
+ _CHR["MONTH"][_CHR["MONTH"]["Oct"]="10"]="Oct"
+ _CHR["MONTH"][_CHR["MONTH"]["Nov"]="11"]="Nov"
+ _CHR["MONTH"][_CHR["MONTH"]["Dec"]="12"]="Dec"
+#_____________________________________________________________________________
+
+ _TAB_STEP_DEFAULT =8
+#_____________________________________________________________________________
+
+ for ( i=0; i<32; i++ ) _REXPSTR[_CHR[i]]=_QSTRQ[_CHR[i]]
+ for ( ; i<256; i++ ) _REXPSTR[_CHR[i]]=_CHR[i]
+ _gensubfn("\\^$.()|{,}[-]?+*",".","_rexpstr_i0") }
+#_____________________________________________________________________________
+func _rexpstr_i0(t,A,p0) {
+ return _REXPSTR[t]="\\" t }
+
+
+
+
+
+
+BEGIN { _addlib("_SYSIO") } #########################################################
+
+func _SYSIO(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_SYSIO 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+ _SYS_STDCON ="CON"
+ _CON_WIDTH=match(_cmd("MODE "_SYS_STDCON" 2>NUL"),/Columns:[ \t]*([0-9]+)/,A) ? strtonum(A[1]) : 80 }
+
+
+
+
+
+
+BEGIN { _addlib("_FILEIO") } #######################################################
+
+func _FILEIO(c,t,P, A) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ if ( match(t,/^[ \t]*-[Tt]([\+-])[ \t]*/,A) ) { t=substr(t,RLENGTH+1)
+ if ( A[1]=="+" ) _fileio_notdeltmpflag=1
+ else _fileio_notdeltmpflag="" }
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ if ( _fileio_notdeltmpflag ) {
+ _info("Temporary objects deletion DISABLED (inherited)")
+ }
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return _ln(" -[Tt][+-] - inherited: +enable\\-disable temporary files\\dirs deletion") _ln()
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_FILEIO 2.1")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ P["ENVIRON"]["CD"] =ENVIRON["CD"]
+ P["_FILEIO_RD"] =_FILEIO_RD
+ P["_FILEIO_R"] =_FILEIO_R
+ P["_FILEIO_D"] =_FILEIO_D
+ if ( !("_FILEIO_TMPRD" in P) ) {
+ P["_FILEIO_TMPRD"] =_getmpdir(_filen(P["SOURCE"]) "." ++_egawk_subcntr _CHR["SUBDIR"]) }
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+ if ( _SYS_STDOUT=="" ) _SYS_STDOUT="/dev/stdout"
+ if ( _SYS_STDERR=="" ) _SYS_STDERR="/dev/stderr"
+ _CHR["SUBDIR"]="\\"
+ if ( _gawk_scriptlevel<1 ) {
+ match(b=_cmd("echo %CD% 2>NUL"),/[^\x00-\x1F]*/)
+ ENVIRON["CD"]=_FILEIO_RD=_filerd(substr(b,RSTART,RLENGTH) _CHR["SUBDIR"]); _FILEIO_R=_filer(_FILEIO_RD); _FILEIO_D=_filed(_FILEIO_RD)
+ _setmpath(_filerd(_FILEIO_RD "_tmp" _CHR["SUBDIR"])) } }
+
+
+
+
+
+
+BEGIN { _addlib("_tOBJ") } #########################################################
+
+func _tOBJ(c,t,P) {
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+ case "_lib_NAMEVER":
+ return _ln("_tOBJ 3.0")
+ #___________________________________________________________
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+ case "_lib_END":
+ return
+ #___________________________________________________________
+ case "_lib_CLEANUP":
+ return _tOBJ_CLEANUP() } }
+#_______________________________________________________________________
+func _tOBJ_CLEANUP( p) { ##############################################
+ for ( p in UIDSDEL ) {
+ delete _ptr[p]
+ delete _tPREV[p]; delete _tPARENT[p]; delete _tNEXT[p]
+ delete _tFCHLD[p]; delete _tQCHLD[p]; delete _tLCHLD[p]
+ delete _TMP0[p]; delete _TMP1[p]
+ delete _tLINK[p]; delete _tCLASS[p] } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+ _tInBy ="\x8A._tInBy"
+ _tgenuid_init()
+ _UIDS[""]; delete _UIDS[""]; _UIDSDEL[""]; delete _UIDSDEL[""]
+ _tPREV[""]; _tPARENT[""]; _tNEXT[""]; _tFCHLD[""]; _tQCHLD[""]; _tLCHLD[""]
+ _tLINK[""]; _tCLASS[""]
+ _tSTR[""]; _tDLINK[""]
+ _[""]; delete _[""]; _ptr[""]; delete _ptr[""]
+ _TMP0[""]; delete _TMP0[""]; _TMP1[""]; delete _TMP1[""] }
+
+
+
+
+
+BEGIN{ _addlib("_ERRLOG") } ########################################################
+
+func _ERRLOG(c,t,P, a,b,A) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ if ( match(t,/^[ \t]*-L:([TtVvIiWwEeFf]*)[ \t]*/,A) ) { t=substr(t,RLENGTH+1); _errlog_errflkey=_errlog_errflkey A[1] }
+ return t
+ #_______________________________________________________________________
+
+ case "_lib_APPLY":
+ if ( _errlog_errflkey ) {
+ split(_errlog_errflkey,A,"")
+ for ( a=1; a in A; a++ ) {
+ if ( A[a]==toupper(A[a]) ) b=1; else b=""
+ switch ( toupper(A[a]) ) {
+ case "T":
+ _ERRLOG_TF=b; break
+ case "V":
+ _ERRLOG_VF=b; break
+ case "I":
+ _ERRLOG_IF=b; break
+ case "W":
+ _ERRLOG_WF=b; break
+ case "E":
+ _ERRLOG_EF=b; break
+ case "F":
+ _ERRLOG_FF=b; break } }
+ if ( _ERRLOG_IF ) {
+ _info("Log-message types inherited acc/deny: " "TRACE " (_ERRLOG_TF ? "ON" : "OFF") "/" "VERBOSE " (_ERRLOG_VF ? "ON" : "OFF") "/" "INFO " (_ERRLOG_IF ? "ON" : "OFF") "/" "WARNING " (_ERRLOG_WF ? "ON" : "OFF") "/" "ERROR " (_ERRLOG_EF ? "ON" : "OFF") "/" "FATAL " (_ERRLOG_FF ? "ON" : "OFF") ) } }
+ return
+ #_______________________________________________________________________
+
+ case "_lib_HELP":
+ return _ln(" -L:TtVvIiWwEeFf - enable(upcase: TVIWEF) or disable(lowcase: tviwef) allowable type of") _ln(" log messages. Trace/Verbose/Informational/Warning/Error/Fatal.") _ln()
+ #_______________________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_ERRLOG 1.0")
+ #_______________________________________________________________________
+
+ case "_lib_BEGIN":
+ P["_ERRLOG_TF"] =_ERRLOG_TF
+ P["_ERRLOG_VF"] =_ERRLOG_VF
+ P["_ERRLOG_IF"] =_ERRLOG_IF
+ P["_ERRLOG_WF"] =_ERRLOG_WF
+ P["_ERRLOG_EF"] =_ERRLOG_EF
+ P["_ERRLOG_FF"] =_ERRLOG_FF
+ P["_errlog_file"] ="/dev/stderr"
+ return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+ if ( _gawk_scriptlevel<1 ) {
+ _ERRLOG_TF =1
+ _ERRLOG_VF =1
+ _ERRLOG_IF =1
+ _ERRLOG_WF =1
+ _ERRLOG_EF =1
+ _ERRLOG_FF =1
+ _wrfile(_errlog_file=_getmpfile("OUTPUT.LOG"),"") } }
+
+
+
+
+
+
+BEGIN { _addlib("_SHORTCUT") } #####################################################
+
+func _SHORTCUT(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_shortcut 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN { _shortcut_init() } #########################################################
+
+
+
+BEGIN { _addlib("_eXTFN") } ########################################################
+
+func _eXTFN(c,t,P) {
+ switch ( c ) {
+ case "_lib_CMDLN":
+ return t
+ #___________________________________________________________
+
+ case "_lib_APPLY":
+ return
+ #___________________________________________________________
+
+ case "_lib_HELP":
+ return
+ #___________________________________________________________
+
+ case "_lib_NAMEVER":
+ return _ln("_extfn 1.0")
+ #___________________________________________________________
+
+ case "_lib_BEGIN":
+ return
+ #___________________________________________________________
+
+ case "_lib_END":
+ return } }
+#___________________________________________________________________________________
+BEGIN { _extfn_init() } ############################################################
+
+
+BEGIN { _addlib("_sHARE") } ##############################################################
+#_____________________________________________________________________________
+func _sHARE(c,t,P, a,A) { ###################################################
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN": return t
+ #_____________________________________________________
+ case "_lib_APPLY": return
+ #_____________________________________________________
+ case "_lib_HELP": return
+ #_____________________________________________________
+ case "_lib_NAMEVER": return _ln("_share 1.000")
+ #_____________________________________________________
+ case "_lib_BEGIN": return
+ #_____________________________________________________
+ case "_lib_END": return } }
+
+BEGIN { _addlib("_FILEVER") } ############################################################
+#_____________________________________________________________________________
+func _FILEVER(c,t,P, a,A) { #################################################
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN": return t
+ #_____________________________________________________
+ case "_lib_APPLY": return
+ #_____________________________________________________
+ case "_lib_HELP": return
+ #_____________________________________________________
+ case "_lib_NAMEVER": return
+ #_____________________________________________________
+ case "_lib_BEGIN": return
+ #_____________________________________________________
+ case "_lib_END": return } }
+
+
+BEGIN { _addlib("_DS") ###############################################################################
+
+ _PRODUCT_NAME ="Deployment Solution Control"
+ _PRODUCT_VERSION ="1.0"
+ _PRODUCT_COPYRIGHT ="Copyright (C) 2013 by CosumoGEN"
+ _PRODUCT_FILENAME ="_main.ewk"
+}#____________________________________________________________________________
+func _DS(c,t,P, a,A) { ######################################################
+ switch ( c ) {
+ #___________________________________________________________
+ case "_lib_CMDLN": return t
+ #_____________________________________________________
+ case "_lib_APPLY": return
+ #_____________________________________________________
+ case "_lib_HELP": return _ln() _ln( " Usage: " _PRODUCT_NAME " [/key1 /key2...] sourcefile [cmdline]") _ln()
+ #_____________________________________________________
+ case "_lib_NAMEVER": return
+ #_____________________________________________________
+ case "_lib_BEGIN": return
+ #_____________________________________________________
+ case "_lib_END": return } }
+
+func _INIT(f) { } #############################################################################
+
+
+
+func _pmap(m,s1,s2,s3,s4,s5,s6,s7,s8) {
+ if ( match(m,/^([^\(]+)\(([^\)]*)\)$/,_QMAP) ) { _qparamf1=_QMAP[1]; _QMAP[0]="r" (_qparamc1=split(_QMAP[2],_QMAP,""))
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8) } }
+
+func _p1(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s1,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p2(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s2,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p3(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s3,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p4(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s4,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p5(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s5,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p6(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s6,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p7(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s7,p1,p2,p3,p4,p5,p6,p7) }
+
+func _p8(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+ _qparamf0="_p" _QMAP[_qparamc1--]
+ return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s8,p1,p2,p3,p4,p5,p6,p7) }
+
+func _pr8(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3,p4,p5,p6,p7,p8) }
+
+func _pr7(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3,p4,p5,p6,p7) }
+
+func _pr6(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3,p4,p5,p6) }
+
+func _pr5(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3,p4,p5) }
+
+func _pr4(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3,p4) }
+
+func _pr3(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2,p3) }
+
+func _pr2(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1,p2) }
+
+func _pr1(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1(p1) }
+
+func _pr0(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+ return @_qparamf1() }
+
+
+
+
+
+
+
+
+
+
+
+func hujf(a,b,c) { _conl("hujf(" a "," b "," c ")") }
+
+
+
+
+func _qparam(qm,p0,p1,p2,p3,p4,p5,p6,p7) {
+
+ if ( qm==qm+0 && qm>0 ) _qparamim=substr(" ",1,qm)
+ else if ( qm!="" ) _qparamim=qm
+ else _qparamim=" "
+ _qparamask=""; return _qparam_i0(p0,p1,p2,p3,p4,p5,p6,p7) }
+
+func _qparam_i0(p0,p1,p2,p3,p4,p5,p6,p7) { _qparama0=substr(_qparamim,1,1); _qparamim=substr(_qparamim,2)
+ switch ( _qparama0 ) { case "": gsub(/ +$/,"",_qparamask); return length(_qparamask)
+ default: if ( isarray(p0) ) _qparama0="A"
+ else if ( p0=="" && p0==0 ) _qparama0=" "
+ else if ( _isptr(p0) ) _qparama0="P"
+ else _qparama0="S"
+ case ".": _qparamask=_qparamask _qparama0
+ return _qparam_i0(p1,p2,p3,p4,p5,p6,p7) } }
+func tts(p,uidel,psfx,cnt,chr,p5,p6,p7, im) {
+ im=" "
+ im=".. .."
+ _conl("ret: " _qparam(im,p,uidel,psfx,cnt,chr,p5,p6,p7) "'")
+ _conl("mask: `" _qparamask "'") }
+
+func _uidcyc(p, i) {
+ _dumpuidgen(p)
+ for ( i=1; i<(64*8*6-1); i++ ) _conl(i ":" _var(_getuid(p)))
+ _dumpuidgen(p) }
+
+
+
+func _dumpuidgen(p, pd,pc,ps) {
+ _conline("#" (++cntdm) ": " p "'"); _conl()
+ if ( p in _tuidel ) { _conl("DEL: " _var(pd=_tuidel[p]))
+ _conl(_dumparr(_tUIDEL[pd]) _ln()) }
+ _conl("PFX: " _tUIDPFX[p] "'"); _conl("SFX: " _tUIDSFX[p] "'")
+
+ _conl("COUNT: " (p in _tuidcnt ? (pc=_tuidcnt[p]) "'" : _th0("-",pc=-2)))
+ _con("CHARS: "); if ( p in _tuidchr ) { _conl((ps=_tuidchr[p]) "'")
+ _conl("HCHR: " (pc==-2 ? "-" : _tUIDCNTH[pc] "'")); _conl(_dumparr(_tUIDCHRH[ps]) _ln())
+ _conl("LCHR: " (pc==-2 ? "-" : _tUIDCNTL[pc] "'")); _conl(_dumparr(_tUIDCHRL[ps]) _ln()) }
+ else _conl("-") }
+
+
+
+# prefix -
+# prichr - aware character `{', `^',`]'
+# sechr - aware character `.' as the first char of sechr, and character `}'
+# suffix - aware character `]'
+# cntptr - aware character `]'
+
+func _tr(n,cs, H) {
+ #_tuidinitcs[p]=cs
+ #2 uidel, 5 pfx, 7 hichr,11(10) lochr,14 suffix
+ _rconline(n ": " cs); _rconl()
+ if ( match(cs,/^((([^\xB4:\[\|\]]*\xB4.)*[^\xB4:\[\|\]]*):)?((([^\xB4\[\|\]]*\xB4.)*[^\xB4\[\|\]]*)\[)?(([^\xB4\|\]]*\xB4.)*[^\xB4\|\]]*)?(\|(\.)?(([^\xB4\]]*\xB4.)*[^\xB4\]]*))?(\](.*))?$/,H) ) {
+ _rconl("delptr: " _une(H[2]) "'")
+ _rconl("pfxstr: " _une(H[5]) "'")
+ _rconl("hichr: " _une(H[7]) "'")
+ _rconl("lochr: " _une(H[10] ? H[7] "' and " H[11] "'" : H[11] "'"))
+ _rconl("sfxstr: " _une(H[14]) "'") }
+ else _rconl("NOT MATCH!")
+ _rconl() }
+
+func _une(t) { return gensub(/\xB4(.)/,"\\1","G",t) }
+func _rconl(t) { _rprt=_rprt _ln(t) }
+func _rconline(t) { _rprt=_rprt _ln((t=" " t " ") _getchrln("_",_CON_WIDTH-length(t)-1)) }
+
+
+
+
+
+
+
+
+
+
+
+
+func _splitpath_test() {
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" ")
+ _fpp(" fi le . ex t ")
+ _fpp(" di r0 / / ")
+ _fpp(" di r0 / / fi le . ex t ")
+ _fpp(" / ")
+ _fpp(" / fi le . ex t ")
+ _fpp(" / di r0 / / ")
+ _fpp(" / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" c : ")
+ _fpp(" c : fi le . ex t ")
+ _fpp(" c : di r0 / / ")
+ _fpp(" c : di r0 / / fi le . ex t ")
+ _fpp(" c : / / ")
+ _fpp(" c : / / fi le . ex t ")
+ _fpp(" c : / / di r0 / / ")
+ _fpp(" c : / / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" / / ")
+ _fpp(" / / ho st . hs t ")
+ _fpp(" / / ho st / / ")
+ _fpp(" / / ho st / / fi le . ex t ")
+ _fpp(" / / ho st / / di r0 / / ")
+ _fpp(" / / ho st / / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" / / ho st / / c : ")
+ _fpp(" / / ho st / / c : fi le . ex t ")
+ _fpp(" / / ho st / / c : di r0 / / ")
+ _fpp(" / / ho st / / c : di r0 / / fi le . ex t ")
+ _fpp(" / / ho st / / c : / / ")
+ _fpp(" / / ho st / / c : / / fi le . ex t ")
+ _fpp(" / / ho st / / c : / / di r0 / / ")
+ _fpp(" / / ho st / / c : / / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" http : / / / ")
+ _fpp(" http : / / / si te . ex t ")
+ _fpp(" http : / / / si te / / ")
+ _fpp(" http : / / / si te / / fi le . ex t ")
+ _fpp(" http : / / / si te / / di r0 / / ")
+ _fpp(" http : / / / si te / / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" ftp : / / / : po rt ")
+ _fpp(" ftp : / / / si te . ex t : po rt ")
+ _fpp(" ftp : / / / si te : po rt / / ")
+ _fpp(" ftp : / / / si te : po rt / / fi le . ex t ")
+ _fpp(" ftp : / / / si te : po rt / / di r0 / / ")
+ _fpp(" ftp : / / / si te : po rt / / di r0 / / fi le . ex t ")
+ _conl(); _conl("## //. ######################################################################################"); _conl()
+ _fpp(" / / . ")
+ _fpp(" / / . / / ")
+ _fpp(" / / . / / com 56 ")
+ _fpp(" / / . / / com 56 / / ")
+ _fpp(" / / . / / c : ")
+ _fpp(" / / . / / c : / / ")
+ _fpp(" / / . / / c : com 56 ")
+ _fpp(" / / . / / c : com 56 / / ")
+ _fpp(" / / . / / c : / / com 56 ")
+ _fpp(" / / . / / c : / / com 56 / / ")
+ _conl(); _conl("## //? ######################################################################################"); _conl()
+ _fpp(" / / ? ")
+ _fpp(" / / ? / / ")
+ _fpp(" / / ? / / com 56 ")
+ _fpp(" / / ? / / com 56 / / ")
+ _fpp(" / / ? / / c : ")
+ _fpp(" / / ? / / c : / / ")
+ _fpp(" / / ? / / c : com 56 ")
+ _fpp(" / / ? / / c : com 56 / / ")
+ _fpp(" / / ? / / c : / / com 56 ")
+ _fpp(" / / ? / / c : / / com 56 / / ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _fpp(" / / / ")
+ _fpp(" / / / . hs t ")
+ _fpp(" / / / / fi le . ex t ")
+ _fpp(" / / / / di r0 / / ")
+ _fpp(" / / / / di r0 / / di r1 / fi le . ex t ")
+ _fpp(" / / / / c : ")
+ _fpp(" / / / / c : fi le . ex t ")
+ _fpp(" / / / / c : di r0 / / ")
+ _fpp(" / / / / c : di r0 / / fi le . ex t ")
+ _fpp(" / / / / c : / / ")
+ _fpp(" / / / / c : / / fi le . ex t ")
+ _fpp(" / / / / c : / / di r0 / / ")
+ _fpp(" / / / / c : / / di r0 / / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+
+
+ return }
+# this is somnitelno: that / / . / / com 56 / / - is the DEV...; what is DEV ??? this already PROBLEM
+#_____________________________________________________________________________
+func _patharr0(D,q, i,h,A,B) { ##############################################
+ delete D; if ( 0<q=split(gensub(/\\/,"/","G",gensub(/ *([:$\\\/]) */,"\\1","G",gensub(/(^[ \t]+)|([ \t]+$)/,"","G",q))),A,/\/+/,B) ) {
+ if ( 2>h=length(B[1]) ) { D["type"]="FILE"; A[1]=_patharr0_i0(A[1],D,"drive"); return _patharr0_i1(D,A,1,q) }
+ i=gensub(/ *([\.\?]) */,"\\1","G",A[2]); IGNORECASE=1; match(A[1],/^((https?)|(ftp)):$/); IGNORECASE=0
+ if ( RLENGTH>0 ) { D["type"]=toupper(substr(A[1],1,RLENGTH-1)); _patharr0_i0(i,D,"site","port") }
+ else if ( A[1]=="" ) { D["type"]="UNC"; if ( h>2 ) { D["host"]; A[2]=_patharr0_i0(A[2],D,"drive","","FILE"); return _patharr0_i1(D,A,2,q) }
+ if ( i=="" ) return 1
+ D["host"]=i; A[3]=_patharr0_i0(A[3],D,"drive","","FILE") }
+ else { D["type"]="FILE"; A[1]=_patharr0_i0(A[1],D,"drive"); return _patharr0_i1(D,A,1,q) } return _patharr0_i1(D,A,3,q) } }
+ #_____________________________________________________
+ func _patharr0_i0(t,D,l,r,d, i) { if ( i=index(t,":") ) { if ( d ) D["type"]=d
+ if ( i>1 ) D[l]=substr(t,1,i-1)
+ if ( (t=substr(t,i+1)) && r ) D[r]=t; return t }
+ else if ( t && r ) D[l]=t; return t }
+ #_____________________________________________________
+ func _patharr0_i1(D,A,i,q, t,c) { if ( D["type"]=="UNC" ) { if ( t=A[i++] ) D[0]=(D["share"]=D[++c]=t) "/"; else return 1 }
+ while ( i<q ) D[0]=D[0] (D[++c]=A[i++]) "/"
+ if ( i==q ) { if ( match(t=A[i],/\.[^\.]*$/) ) { if ( RSTART>1 ) D["name"]=substr(t,1,RSTART-1); D["ext"]=substr(t,RSTART,RLENGTH) }
+ else if ( t!="" ) D["name"]=t } return 1 }
+
+
+func _fpp(q, D,S) {
+ _conl(); _conline(q); _conl();
+ q=_patharr0(S,q)
+ #_arregpath(D,S)
+ #_conl(_dumparr(D))
+ _conl( _dumparr(S)); _conl()
+
+ return q }
+
+
+func _rpp(q, D,S) {
+ _conl(); _conline(q); _conl();
+
+ _regpath0(D,q)
+ #_conl(_dumparr(D))
+
+ _conl(_ln("DEST:") _dumparr(D)); _conl()
+ return q }
+
+func _split_regpath() {
+ _rpp(" / / / / ")
+ _rpp(" / / / / huj ")
+ _rpp(" / / / / huj / ")
+ _rpp(" / / / / huj / pizda.TSR ")
+ _rpp(" / / / / hklm ")
+ _rpp(" / / / / hklm / ")
+ _rpp(" / / / / hklm / huj ")
+ _rpp(" / / / / hklm / huj / ")
+ _rpp(" / / / / hklm / huj / pizda.TSR ")
+ _conl(); _conl("########################################################################################"); _conl()
+ _rpp(" / / / / hklm / software / altiris / fi le . ex t ")
+ _rpp(" / / . / / hkcr / software / altiris / fi le . ex t ")
+ _rpp(" / / ? / / hKcU / software / altiris / fi le . ex t ")
+ _rpp(" / / lOcAlHoSt / / hKu / software / altiris / fi le . ex t ")
+ _rpp(" / / ho st / / hKcc / software / altiris / fi le . ex t ")
+ _rpp(" / / ho st / / hKPd / software / altiris / fi le . ex t ")
+ _conl(); _conl("########################################################################################"); _conl()
+
+
+
+ }
+# test with the different path types
+# _conl(_ln("SRC:") _dumparr(S)); _conl();
+
+func _ini(p,cs, dptr,pfx,sfx,hstr,lstr) {
+ return _inituid(p,cs, dptr,pfx,sfx,hstr,lstr,A) }
+
+#_______________________________________________________________________
+func _inituid(p,cs, dptr,pfx,sfx,hstr,lstr,A) { ################### 1 #
+ if ( cs==0 && cs=="" ) { cs=p; p=_getuid() }
+
+ _conl(); _conl(); _conl(cs)
+
+ if ( match(cs,/^(([^:]*):)?(([^'\xB4]*\xB4.)*[^'\xB4]*)[']/,A) ) { pfx=A[3]; dptr=A[2] }
+ if ( match(cs=substr(cs,1+RLENGTH),/'(([^'\xB4]*\xB4.)*[^'\xB4]*)$/,A) ) { sfx=A[1]; cs=substr(cs,1,RSTART-1) }
+ if ( match(cs,/^(([`\^])(.*))/,A) ) { if ( A[2]=="`" ) { hstr=A[3] "~"; lstr="" } else { lstr=A[3] "+"; hstr="" } }
+ else if ( match(cs,/^(([^'\xB4\|]*\xB4.)*[^'\xB4\|]*)(\|(.*))?/,A) ) { hstr=A[1]; lstr=A[4] }
+ else { ERRNO="_inituid(): bad parameters"; return }
+
+ _conl(dptr ":" pfx "'" hstr "|" lstr "'" sfx)
+
+ return _cfguid(p,dptr,pfx,sfx,hstr,lstr) }
+
+# dptr - morg ptr; in case if object deleted then _CLASSPTR[ptr] will be deleted(object is death), but
+# _tUIDEL[_CLASSPTR[ptr]] will be created that object can be resurrected from morg
+# dptr can be any string containing any characters except `:'. It's not verified
+# pfx,sfx - uid prefix str, and uid suffix str; this strings specifies string that can be inserted before/after
+# uid generated by uid generator:
+#
+# class uid: pfx uidgen sfx
+#
+# Both can be any string(including ""), and can contains any character with B4-escaping feature.
+# Note: that this strings cannot contains "'" character: it's should be escaped by B4-escaper.
+# hstr,lstr - this values configure uid-generator itself. ther is a 3 combinations regarding its:
+#
+# hstr lstr function
+#
+# `ptr * - specify pointer to external uid-generator
+# All uids and chars will be generated by external uid-generator
+# * ^ptr - class will have it's own uid generator using external character set
+# str str - class will have it's own uid generator with it's own character set
+# character set inmplemented in hstr(high-charset) and in lstr(low-charset) in 2 ways:
+# 1) "AB" "AB01" - this mean that high-charset contain chars: `A' and `B'
+# low-charset contains chars: `A', `B', `0', `1'
+#
+# 2) "Az,By" "Ax,Bw,0v,1u" - this mean that high-charset contain chars: `Az' and `By'
+# low-charset contains chars: `Ax', `Bw', `0v', `1u'
+# Note: both: hstr and lstr cannot contain char `,' directly, but it's can uses
+# B4-escaper to escape any char including `,'
+
+
+
+# !!!! in case of using `,' in hstr/lstr - the escaped `,' will leads to interpretate hstr and lstr as divided by `,'
+# if parameters error then i should be more specific about what error in parameters detected
+# document _inituid(): parameters; document cs: uid initialization string format
+# test with escape char
+# adv hstr and lstr splitting?
+# chk if hstr len==0 ?
+# return _tclass & report error?
+# _tapi thru function
+
+# additional syntax checking ???
+# implement syntax and uid srv in docs
+# add _dumpuid() ????
+# make performance measurement
+# protection against badchar list
+# additional feature to specify _getuid() to not resurrect uid; and informative that uid was ressurected or not
+# build _defclass fn
+
+# _tuidinitcs ????
+# _tuidchrh[p]
+# _tuidchrl[p]
+# _tuidchr[p]
+# _tuidcnt[p]
+# _tUIDPFX[p]
+# _tUIDSFX[p]
+# _tUIDEL
+# _tUIDCNTH
+# _tUIDCNTL
+# _tUIDCHRL
+# _tUIDCHRH
+
+# create default class basic `new' and `del' functions
+
+
+
+func _tstini() {
+ _ini("uidel:pfx'hstr|lstr'sfx")
+ _ini("uidel:pfx'hstr|lstr'")
+ _ini("uidel:'hstr|lstr'sfx")
+ _ini("uidel:'hstr|lstr'")
+ _ini("uidel:pfx'hstr'sfx")
+ _ini("uidel:pfx'hstr'")
+ _ini("uidel:'hstr'sfx")
+ _ini("uidel:'hstr'")
+ _conl(); _conl("########################################################################################"); _conl()
+ _ini("pfx'hstr|lstr'sfx")
+ _ini("pfx'hstr|lstr'")
+ _ini("'hstr|lstr'sfx")
+ _ini("'hstr|lstr'")
+ _ini("pfx'hstr'sfx")
+ _ini("pfx'hstr'")
+ _ini("'hstr'sfx")
+ _ini("'hstr'")
+ _conl(); _conl("########################################################################################"); _conl()
+ _ini("uidel:pfx'`cntptr'sfx")
+ _ini("uidel:pfx'`cntptr'")
+ _ini("uidel:'`cntptr'sfx")
+ _ini("uidel:'`cntptr'")
+ _conl(); _conl("########################################################################################"); _conl()
+ _ini("pfx'`cntptr'sfx")
+ _ini("pfx'`cntptr'")
+ _ini("'`cntptr'sfx")
+ _ini("'`cntptr'")
+ _conl(); _conl("########################################################################################"); _conl()
+ _ini("uidel:pfx'^chrptr'sfx")
+ _ini("uidel:pfx'^chrptr'")
+ _ini("uidel:'^chrptr'sfx")
+ _ini("uidel:'^chrptr'")
+ _conl(); _conl("########################################################################################"); _conl()
+ _ini("pfx'^chrptr'sfx")
+ _ini("pfx'^chrptr'")
+ _ini("'^chrptr'sfx")
+ _ini("'^chrptr'")
+ _conl(); _conl("########################################################################################"); _conl()
+
+
+ }
+
+func _rtn(v,A) {
+ _conl(); _conline(_val(v) " : " _val(A)); _conl()
+
+ _rtn2(v,A)
+
+ _conl() }
+
+func _rtn2(v,A, r,t) {
+
+ r=isarray(A) ? _typa(v,A) : _typ(v)
+
+ if ( "`">_t0 && _t0 ) _conl("ggggg")
+
+ t=(r ? "TRUE" : "FALSE") " / " (r>0 ? r ">0" : r "!>0") " / " (r+0>0 ? r "+0>0" : r "+0!>0") " / " (r+0!=r ? r "+0!=" r : r "+0==" r) " / " (r && "`">r ? "'`'>" r " && " r : "!('`'>" r " && " r")")
+
+ _conl("`" r "' : " t)
+
+ return r }
+
+
+
+
+func _typ(p) {
+ return _t0=isarray(p) ? "#" : p==0 ? p=="" ? 0 : p in _CLASSPTR ? "`" : p ? 3 : 4 : p in _CLASSPTR ? "`" : p+0==p ? 5 : p ? 3 : 2 }
+
+func _typa(p,A) {
+
+ return _t0=isarray(p) ? "#" : p==0 ? p=="" ? 0 : p in A ? "`" : p ? 3 : 4 : p in A ? "`" : p+0==p ? 5 : p ? 3 : 2 }
+
+# # - p is array
+# ` - p is ptr detected in array _CLASSPTR(for _typ); or p is ptr detected in array A(for _typa)
+# 0 - p is undefined
+
+# 2 - p is string==""
+# 3 - p is string!=""
+# 4 - p is number 0
+# 5 - p is any number except 0(positive and negative)
+
+# str: _typ(p)+0 !_typ(p)+0
+# str/ptr _typ(p)>0 _typ(p)<1
+# str/arr "`">_typ(p0) && _t0
+# str/ptr/arr _typ(p) !_typ(p)
+# ptr _typ(p)=="`" _typ(p)<"`" ?
+# ptr/arr _typ(p)+0!=_t0
+# arr _typ(p)=="#" _typ(p)>"#" ?
+
+func zorr(A,i, r) {
+ if ( i in A ) _conl("`" i "' in A"); else _conl("`" i "' not in A")
+ r=A[i]=="" && A[i]==0
+ _conl("A[" i "] status is " r)
+ return
+
+ a=a+-a
+ _conl("``````````````" a "''''''''''''''''") }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func test_splitstr(A) {
+
+ AA0[-1]="huj"; AA0["A"]="pizda"; AA0[1]="zhopa"
+ delete AB0[AB0[""]=""]
+ AC0[-1]="HUJ"; AC0["A"]="PIZDA"; AC0[1]="ZHOPA"
+
+ _SPLITSTRB0["1"]
+
+
+ wonl=""
+ _tstv(0,A,0,"_tstv")
+ _conl(wonl)
+ _wrfile("wonl.out",wonl)
+ }
+
+
+
+func _tstv(p,A,r,f) {
+
+ if ( f=="" ) f="tst_splitstr"
+
+ @f(_NOP,A,p)
+ @f(AA0,A,p)
+ @f(AB0,A,p)
+ @f(AC0,A,p)
+ @f("",A,p)
+ @f("a",A,p)
+ @f("´a",A,p)
+ @f("´",A,p)
+ @f("a´´´,ba´´´,",A,p)
+ @f("´,",A,p)
+
+ @f(",",A,p)
+ @f("´a,",A,p)
+ @f("ab,",A,p)
+ @f("ab,´",A,p)
+ @f("´a´,,ba",A,p)
+ @f(",a,,b´,c,,´a,,´,,,",A,p)
+
+ }
+
+func _wonl(t) {
+ wonl=wonl _ln(t) }
+
+func _wonline(t) {
+ wonl=wonl _ln(substr(" _ " t " _____________________________________________________________________________________________________________________________________",1,126)) }
+
+func tst_splitstr(t,A,R, r) {
+ delete A; A["not cleared"]
+ _wonl()
+ _wonline("_splitstr(" (isarray(t) ? "ARR" (length(t)>0 ? "#" (t[1]!="zhopa" ? "U" : "l") : "") : _val0(t)) ",A" (isarray(R) ? ", ARR" (length(R)>0 ? "#" (R[1]!="zhopa" ? "U" : "l") : "") : ", " _val0(R)) "):")
+
+ _wonl( _val0(r=_splitstr(t,A,R)))
+ _wonl("arrary A:"); _wonl(_dumparr(A))
+ return r }
+
+
+ #_____________________________________________________________________________
+ func _val(v,t) { if ( isarray(v) ) return _dumparr(v) _ln(t)
+ if ( v==0 && v=="" ) return _ln("- (ERRNO=" ERRNO ")") _ln(t)
+ return _ln(v "'") _ln(t) }
+
+ #_____________________________________________________________________________
+ func _val0(v) { if ( isarray(v) ) return _dumparr(v)
+ if ( v==0 && v=="" ) return "-"
+ return "\"" v "\"" }
+
+# add to _dumparr: checking that if element is undefined
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+func _cfguid(p,optr,pfx,sfx,hstrcnt,lstrchr) { #################### 0 #
+ delete _UIDOBL[p]
+ if ( _isptr(optr) ) { if ( optr==p ) { delete _UIDOBLV[p]; delete _UIDOBLV[_UIDOBLV[_UIDOBL[p]=p][""]=p][""] }
+ else if ( optr in _UIDOBL ) _UIDOBL[p]=_UIDOBL[optr] }
+ _UIDPFX[p]=_istr(pfx) ? pfx : ""; _UIDSFX[p]=_istr(sfx) ? sfx : ""
+ if ( _isptr(hstrcnt) ) { if ( hstrcnt!=p ) { _UIDCHR[p]=_UIDCHR[_UIDCNT[p]=_UIDCNT[hstrcnt]]; return p } hstrcnt=_NOP }
+ _UIDCNTL[_UIDCNT[p]=p]=_cfguidchr(p,hstrcnt,lstrchr); return p }
+ #_____________________________________________________
+ func _cfguidchr(p,h,l, H,L) {
+ if ( _isptr(l) ) { if ( l!=p ) return _UIDCHR[p]=_UIDCHR[l]; _UIDCHR[p]=p; l=_NOP }
+ _UIDCHR[p]=p
+ _splitstr(H,h,_UIDCHRH[_classys]); _splitstr(L,l,H)
+ delete _UIDCHRH[_UIDCHRH[p][""]=p][""]; delete _UIDCHRL[_UIDCHRL[p][""]=p][""]
+ _cfguidh(p,H,L); return _cfguidl(p,L,L) }
+ #_______________________________________________
+ func _cfguidh(p,H,L, hi,h,li) { for ( hi=1; hi in H; hi++ ) { h=H[hi]
+ for ( li=1; li in L; li++ ) _UIDCHRH[p][h L[li]] } }
+ func _cfguidl(p,H,L, hi,h,hl,li) { for ( hi=1; hi in H; hi++ ) { h=H[hi]
+ for ( li=1; li in L; li++ ) hl=_UIDCHRL[p][hl]=h L[li] }
+ return hl }
+
+# problem configuring uid by array charset: i can' understand what format of the array: possibly - remove array support
+# after removal of array format detection: there is unfinished conflicts: it is possible to totally remove array uid-gen initialization
+
+ #_____________________________________________________
+ BEGIN { _inituidefault() }
+ func _inituidefault( h,l,H,L) {
+ _classys =""
+
+ delete _UIDOBLV[_UIDOBLV[_UIDOBL[_classys]=_classys][""]=_classys][""]
+ _UIDPFX[_classys]; _UIDSFX[_classys]
+ _UIDCNT[_classys]=_UIDCHR[_classys]=_CLASSPTR[_classys]=_classys
+
+ h ="AB"
+ l =h "01"
+
+ _splitstr(H,h); _splitstr(L,l);
+ delete _UIDCHRH[_UIDCHRH[_classys][""]=_classys][""]; delete _UIDCHRL[_UIDCHRL[_classys][""]=_classys][""]
+ _UIDCNTH[_classys]; _cfguidh(_classys,H,L); _UIDCNTL[_classys]=_cfguidl(_classys,L,L)
+
+ _CLASSFN[_classys]["del"] ="_tobjDEL"
+ _CLASSFN[_classys]["new"] ="_tobjNEW"
+ _drawuid(_classys)
+ _initspecialuid() }
+ #_________________________________________
+ func _initspecialuid() {
+ _NOINDEX =_getuid()
+ _LEN =_getuid()
+ _PTR =_getuid()
+ _NAME =_getuid()
+ _TYPE =_getuid()
+ _FORMAT =_getuid()
+
+ }
+#_______________________________________________________________________
+func _getuid(p) { ################################################# 1 #
+ if ( p in _UIDOBL ) { for ( _tptr in _UIDOBLV[_getuida0=_UIDOBL[p]] ) { delete _UIDOBLV[_getuida0][_tptr]; _CLASSPTR[_tptr]=p; return _tptr } }
+ _CLASSPTR[_tptr=_UIDPFX[p] _getuid_i0(_UIDCNT[p],_UIDCHRL[_tptr=_UIDCHR[p]],_UIDCHRH[_tptr]) _UIDSFX[p]]=p
+ return _tptr }
+ #_____________________________________________________
+ func _getuid_i0(p,UL,UH) { if ( ""==_tptr=UL[_UIDCNTL[p]] ) { for ( _tptr in UH ) { delete UH[_tptr]; return (_UIDCNTH[p]=_tptr) (_UIDCNTL[p]=UL[""]) }
+ _fatal("out of UID") }
+ return _UIDCNTH[p] (_UIDCNTL[p]=_tptr) }
+#_______________________________________________________________________
+func _deluid(p) { ################################################# 1 #
+ if ( p in _CLASSPTR ) { _deluida0=_CLASSPTR[p]
+ if ( _deluida0 in _UIDOBL ) _UIDOBLV[_UIDOBL[_deluida0]][p] }
+ delete _CLASSPTR[p]; return _deluida0 }
+
+func test_uid( p,i) {
+ #test_cfg()
+ #return
+
+ _fclass=_cfguid(p=_getuid(_classys),p,"pfx","sfx","abc")
+ #_fclass=_cfguid(p=_getuid(_classys),_NOP,_NOP,_NOP,"",_classys)
+ _conl("_fclass uid: " _getuid(_fclass)); _drawuid(_fclass)
+ _conl("_classys uid: " _getuid(_classys))_drawuid(_classys)
+ for ( i=1; i<81; i++ ) _conl(i ": " _getuid(_fclass))
+ _drawuid(_fclass)
+ }
+
+
+func test_cfg( p,z,AA0,a) {
+ AA0[1]
+
+ _fclass=_cfguid(p=_getuid(_classys),_NOP,_NOP,_NOP,_NOP,_classys); _conl(); _conline(); _conl(); _drawuid(p)
+ _fclass=_cfguid(p=_getuid(_classys),AA0,AA0,AA0,AA0,_classys); _conl(); _conline(); _conl(); _drawuid(p)
+ a=_getuid(z=_fclass=_cfguid(p=_getuid(_classys),p,"<",">","ab","cd")); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+ a=_getuid(_fclass=_cfguid(p=_getuid(_classys),z,0,0,_NOP,z)); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+ a=_getuid(_fclass=_cfguid(p=_getuid(_classys),z,"^","$",z,_classys)); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+ _fclass=_cfguid(p=_getuid(_classys),"oblptr","pfx","sfx","abcd"); _conl(); _conline(); _conl(); _drawuid(p)
+
+
+ _conl("```````````````````" z "'''''''''" ( _isptr(z) ? " ptr" : " not ptr"))
+ _drawuid(z)
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _drawuid(p, cn,ch,o) {
+ _conl("uid: " p)
+ _conl("\toblptr: " (p in _UIDOBL ? _UIDOBL[p] "'" : "-"))
+ if ( p in _UIDOBL ) { if ( !_isptr(o=_UIDOBL[p]) ) _conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> oblptr not pointer")
+ if ( !isarray(_UIDOBLV[o]) ) _conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> no OBLV array at ptr") }
+
+ _conl("\tprefix: " (p in _UIDPFX ? _UIDPFX[p] "'" : "-"))
+ _conl("\tsuffix: " (p in _UIDSFX ? _UIDSFX[p] "'" : "-"))
+ _conl("\tcounters: " (cn=p in _UIDCNT ? _UIDCNT[p] "'" : "-"))
+ if ( cn!="-" ) { _conl("\t\tcntrL: " _UIDCNTL[_UIDCNT[p]] "'")
+ _conl("\t\tcntrH: " _UIDCNTH[_UIDCNT[p]] "'") }
+ _conl("\tcharset: " (ch=p in _UIDCHR ? _UIDCHR[p] "'" : "-"))
+ if ( ch!="-" ) { _conl("chrH: "); _conl(_dumparr(_UIDCHRH[_UIDCHR[p]])); _conl()
+ _conl("chrL: "); _conl(_dumparr(_UIDCHRL[_UIDCHR[p]])); _conl() }
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+func _splitstr(A,t,r) { ########################################### 1 #
+ if ( _istr(t) ) { if ( _splitstr_i0(A,t)>0 ) return _splitstrp0
+ if ( _istr(r) ) return _splitstr_i0(A,r) }
+ else { if ( it=="A" ) if ( length(t)>0 ) { _movarr(A,t); return 0-length(A) }; _istr(r) }
+ if ( it=="A" ) if ( length(r)>0 ) { _movarr(A,r); return 0-length(A) } }
+ #_____________________________________________________
+ func _splitstr_i0(A,t, C) {
+ if ( 2>_splitstrq0=patsplit(t,_SPLITSTRA0,/([^,\xB4]*\xB4.)*[^,\xB4]*/) ) _splitstrq0=split(gensub(/\xB4(.)/,"\\1","G",t),_SPLITSTRA0,"")
+ delete A; _splitstri0=_splitstrp0=0
+ while ( _splitstri0++<_splitstrq0 ) {
+ if ( (t=gensub(/\xB4(.)/,"\\1","G",_SPLITSTRA0[_splitstri0])) in C || t=="" ) continue
+ C[A[++_splitstrp0]=t] }
+ return _splitstrp0 }
+
+# there is problem with string's format: i can;t easilly merge 2 charsets: comma-divided and every-char-divided strings
+
+#_______________________________________________________________________
+func _isptr(p) { ################################################## 1 #
+ if ( isarray(p) ) { is=_NOP; it="A"; return 0 }
+ is=p; if ( p==0 && p=="" ) { it="-"; return 0 }
+ if ( p in _CLASSPTR ) return it="P"
+ it="S"; return 0 }
+#_______________________________________________________________________
+func _istr(p) { ################################################### 1 #
+ if ( isarray(p) ) { is=_NOP; it="A"; return 0 }
+ is=p; if ( p==0 && p=="" ) { it="-"; return 0 }
+ return it=p=="" ? "s" : "S" }
+
+#______________________________________________________________________________________________
+func _START( t,i,A) { #########################################################################
+ _torexp_init()
+ test_uid()
+ return
+ _conl(patsplit("a,b,c",A,/[^,]/,B))
+ test_splitstr(); return
+
+
+ A[""]; _CLASSPTR["ptr"]; ALTARR["ptra"]
+ _conl(_dumparr(SYMTAB))
+ BB[1]=_NOP
+ zorr(1,2,3,4,5,6)
+ zorr(BB,1)
+
+
+ _rtn()
+ _rtn("")
+ _rtn(0); _rtn("0")
+ _rtn(1); _rtn("1")
+ _rtn(-1); _rtn("-1")
+ _rtn("huj")
+ _rtn("ptr")
+ _rtn("ptra",ALTARR)
+ _rtn(ALTARR)
+ _rtn(ALTARR,ALTARR)
+
+
+ return
+ _tstini()
+
+ return
+
+ _splitpath_test()
+# _split_regpath()
+ return
+
+ hh="CPU"
+ _conl("go1!")
+ _conl(_var(_sharepath(hh,"gdfsgdsgsd sdgsdighjui teretiewrotrewut 345345345 rtjtireutireu huj")))
+ _conl("go2!")
+ _conl(_var(_sharelist(AAA,hh),_dumparr(AAA)))
+ _conline()
+ A[1]="h"
+ A[3]="j"
+ t="pizda"
+ if ( match(t,/^pi(Z)da/,A) ) _conl("match")
+ else _conl("not match")
+ _conl(_dumparr(A))
+ return
+
+
+
+
+
+
+
+ _pathSMA="C:\\Program Files\\Altiris\\Altiris Agent\\"
+
+
+ DSPlugInPath =_pathSMA "Agents\\Deployment\\Agent\\"
+ DSAutoPath =_pathSMA
+
+ if ( !_sysinfo(_SYS,_hostname) ) _fatal("_sysinfo: unknown error")
+ _REG[""]; delete _REG[""]
+ _servoutput=_CHR["EOL"] _cmd("sc query state= all")
+
+ _dsbasepath="\\\\CPU\\CPU\\DEV\\PROJECT\\_DS\\"
+ _rdreg(_REG,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris")
+ _wrfile("rego.txt",_dumparr(_REG)); _conl("fF")
+ #_______________________________________________________________________
+
+ c=_getreg_i1(DDD,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\„~.*”Install path",_REG)
+#_________________________________________________________________________________________
+ pp=_n("NAME","NS")
+ #pp=_n()
+ #___________________________________________________________________________________
+ p=_defsolution(pp,"DS Plug-in","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+ ClientConfiguration =_defdll(p,"Client Configuration","ClientConfiguration")
+ ClientImagingPrep =_defdll(p,"Client Inaging Preparation","ClientImagingPrep")
+ ClientImaging =_defdll(p,"Client Imaging","ClientImaging")
+ ClientPCT =_defdll(p,"Client PCT","ClientPCT")
+ ClientRebootTo =_defdll(p,"Client Reboot To","ClientRebootTo")
+ DeploymentAgent =_defdll(p,"Deployment Agent","Deployment Agent")
+ DeploymentSolutionBaseAgent =_defdll(p,"Deployment Solution Base Agent","Deployment Solution Base Agent")
+
+ ClientBCDEdit =_defile(p,"Client BCD Edit","ClientBCDEdit.dll")
+ ClientCopyFile =_defile(p,"Client Copy File","ClientCopyFile.dll")
+ ClientPreImage =_defile(p,"Client Pre Image","ClientPreImage.dll")
+ ClientRebootTo =_defile(p,"Client Reboot To","ClientRebootTo.dll")
+ _defile(p,"ConfigService.exe","ConfigService.exe","")
+ _defile(p,"config.dll","config.dll","")
+
+ _defsrv(p,"DS Plug-in Service","Altiris Deployment Solution - System Configuration")
+ _defreg(p,"Deployment Agent Path","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR")
+ _defile(p,"Altiris_DeploymentSolutionAgent_7_1_x86.msi", _SYS["OSArchitecture"]=="64-bit" ? "C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{9D76E4CA-377A-472D-A82E-EDAD77E7E4ED}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x64.msi" : "C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{4B747D25-612F-48FC-B6B5-9916D1BB755C}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x86.msi","")
+ _defdir(p,"Deployment Folder",a=gensub(/[^\\]*$/,"",1,_rdsafe(_REG,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR","C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\Deployment\\Agent\\")))
+
+ #___________________________________________________________________________________
+ p=_defsolution(pp,"DS Auto","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+ _defdir(p,"C:\\Boot\\Altiris\\iso\\boot\\fonts\\","C:\\Boot\\Altiris\\iso\\boot\\fonts\\")
+ _defdir(p,"C:\\Boot\\Altiris\\iso\\sources\\","C:\\Boot\\Altiris\\iso\\sources\\")
+
+ _defile(p,"C:\\Boot\\Altiris\\iso\\autoinst.exe","C:\\Boot\\Altiris\\iso\\autoinst.exe","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\autoinst.ini","C:\\Boot\\Altiris\\iso\\autoinst.ini","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\autoutil.exe","C:\\Boot\\Altiris\\iso\\autoutil.exe","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\autoutil.ini","C:\\Boot\\Altiris\\iso\\autoutil.ini","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\bcdedit.exe","C:\\Boot\\Altiris\\iso\\bcdedit.exe","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\bootmgr","C:\\Boot\\Altiris\\iso\\bootmgr","")
+ _defile(p,"C:\\Boot\\Altiris\\iso\\bootsect.exe","C:\\Boot\\Altiris\\iso\\bootsect.exe","")
+
+ _defreg(p,"Deployment Automation reg.File","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\File.XSZ","autoutil.exe")
+ _defreg(p,"Deployment Automation reg.Path","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\Path.XSZ","%systemdrive%\\boot\\altiris\\iso")
+#_________________________________________________________________________________________
+
+ _check(pp)
+#_________________________________________________________________________________________
+
+ _conl(_report(pp)); _wrfile("report.txt",_report(pp))
+}#______________________________________________________________________________________________
+func _END() { #################################################################################
+
+}#______________________________________________________________________________________________
+func _EXIT() { ################################################################################
+
+}#____________________________________________________________________________________________________
+func _check(p) { ####################################################################################
+ _dll_check(p)
+ _file_check(p)
+ _serv_check(p)
+ _reg_check(p) }
+#_________________________________________________________________________________________
+func _report(p) { #######################################################################
+ _report_t0=_reportparnt=""; _report_i0(p); _tframe("_report_i0",p)
+ return _report_t0 }
+
+ func _report_i0(p,p0,p1,p2) { if ( p in _tPARENT ) {
+ if ( _reportparnt!=_reportparnt=_tPARENT[p] ) {
+ _report_t0=_report_t0 _ln() _ln((z="_ " _[_tPARENT[p]]["NAME"] " ") _getchrln("_",_CON_WIDTH-length(z)-2)) _ln(_getchrln("#",_CON_WIDTH-2)) _ln() } }
+ if ( "ERROR" in _[p] ) { _report_t0=_report_t0 _reporterr(p,_[p]["ERROR"])}
+ if ( "REPORT" in _[p] ) { _report_t0=_report_t0 _ln(_[p]["REPORT"]) } }
+#___________________________________________________________________________________
+func _creport(p,t,f, z) {
+ _[p]["REPORT"]=_[p]["REPORT"] _ln(t (f=="" ? "" : ": " f)) }
+#___________________________________________________________________________________
+func _reporterr(p,t3, pp,t,t2) {
+ t=""; pp=p
+ do { "NAME" in _[pp] ? t=_[pp]["NAME"] ": " t : "" } while ( pp=_rPARENT(pp) )
+ if ( match(t3,/\x00/) ) return substr(t3,1,RSTART-1) t substr(t3,RSTART+1)
+ return t t3 }
+#___________________________________________________________________________________
+func _dllerr(p,t,f) { if ( t!~/\x00/ ) t="ERROR: \x00" t
+ _errfl=1; _[p]["ERROR"]=_[p]["ERROR"] _ln(t (f=="" ? "" : ": " f)) }
+
+
+#_______________________________________________________________________________________________
+func _defsolution(pp,n,rn, p) { ###############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","solution"))]["NAME"]=n
+ _[p]["REGPATH"]=rn
+ _[p]["ERRHOST"]=pp
+ return p }
+#_________________________________________________________________________________________
+func _defreg(pp,n,f,v, p) { #############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","defreg"))]["NAME"]=n
+ _[p]["REGPATH"]=f; if ( !(v==0 && v=="") ) _[p]["VALUE"]=v }
+ #_______________________________________________________________________
+ func _reg_check(p) { _tframe("_reg_check_i0",p,p) }
+ #_______________________________________________
+ func _reg_check_i0(p,pp,p1,p2) {
+ if ( _[p]["TYPE"]=="defreg" ) {
+ if ( _[p]["REGPATH"] in _REG ) {
+ if ( "VALUE" in _[p] ) { if ( _[p]["VALUE"]==_REG[_[p]["REGPATH"]] ) _creport(p,substr("OK: REGENTRY MATCH(==" _[p]["VALUE"] "): " _[p]["REGPATH"],1,126))
+ else _dllerr(p,substr("REGENTRY NOT MATCH(!=" _[p]["VALUE"] "): " _[p]["REGPATH"],1,126)) }
+ else if ( _VAR[_[p]["REGPATH"]]==_REG[_[p]["REGPATH"]] ) _creport(p,substr("OK: REGPATH MATCH(==" _VAR[_[p]["REGPATH"]] "): " _[p]["REGPATH"],1,126))
+ else _dllerr(p,substr("REGPATH NOT MATCH(!=" _VAR[_[p]["REGPATH"]] "): " _[p]["REGPATH"],1,126)) }
+ else { _dllerr(p,substr("REGPATH NOT FOUND: " _[p]["REGPATH"],1,126)) } } }
+#_________________________________________________________________________________________
+func _defdir(pp,n,f,v, p) { #############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","defdir"))]["NAME"]=n
+ _[p]["DIR"]=f
+ return p }
+#_________________________________________________________________________________________
+func _defile(pp,n,f,v, p) { #############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","defile"))]["NAME"]=n
+ _[p]["FILE"]=f; if ( !(v==0 && v=="") ) _[p]["RQVERSION"]=v
+ return p }
+ #_______________________________________________________________________
+ func _file_check(p) { if ( 1 || "AGENT" in _[p] ) { _tframe("_file_check_i0",p,p) } }
+ #_______________________________________________
+ func _file_check_i0(p,pp,p1,p2, f,v) {
+ if ( _[p]["TYPE"]=="defile" ) {
+ f=_[p]["FILE"]
+ f=(match(f,/^.:/) ? "" : _[_[pp]["AGENT"]][".Install Path"] "\\") _[p]["FILE"]; if ( "RQVERSION" in _[p] ) v=_[p]["RQVERSION"]; else v=_[pp][".Product Version"]
+ ERRNO=""; if ( _th1(_[p]["DATA"]=_rdfile(f),ERRNO) ) { delete _[p]["DATA"]; return _dllerr(p,"read file: " ERRNO,f) }
+ if ( v!="" && v!=(_[p]["VERSION"]=_getfilever(f)) ) return _dllerr(p," file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'",f)
+ _creport(p,substr("OK: FILE DETECTED" (v=="" ? "" : "(" v ")") ": " f,1,122)) }
+ else if ( _[p]["TYPE"]=="defdir" ) { if ( _filexist(f=_[p]["DIR"]) ) _creport(p,substr("OK: DIR DETECTED: " f,1,112))
+ else _dllerr(p,"directory " f " is not detected") } }
+#_________________________________________________________________________________________
+func _defsrv(pp,n,f,v, p) { #############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","defsrv"))]["NAME"]=n
+ _[p]["SERVNAME"]=f
+ return p }
+ #_______________________________________________________________________
+ func _serv_check(p) { _tframe("_serv_check_i0",p,p) }
+ #_______________________________________________
+ func _serv_check_i0(p,p0,p1,p2,p3, i,q,c) {
+ if ( _[p]["TYPE"]=="defsrv" ) {
+ i=IGNORECASE; IGNORECASE=1
+ if ( match(_servoutput,roi="\\012DISPLAY_NAME: " _torexp(_[p]["SERVNAME"])) ) { _creport(p,"OK: SERVICE DETECTED: " substr(_[p]["SERVNAME"],1,112)) }
+ else { _dllerr(p,"service " _[p]["SERVNAME"] " not detected") } }
+ IGNORECASE=i }
+#_________________________________________________________________________________________
+func _defdll(pp,n,rn, p) { ##############################################################
+ _[p=_wLCHLD(pp,_n("TYPE","defdll"))]["NAME"]=n
+ _[p]["REGPATH"]=_[pp]["REGPATH"] rn
+ _[p]["ERRHOST"]=pp
+ return p }
+ #_______________________________________________________________________
+ func _dll_check(pp) { _dllchktv=""; _missfl=1
+ _tframe("_dll_check_i0",pp,_REG,pp) #also check that all dll have same version; also check that all dlls have success and then report that DS plug-in version n - installed
+ if ( 1 || "AGENT" in _[pp] ) {
+ if ( _dllchktv!=_[pp][".Product Version"] ) _dllerr(_[pp]["AGENT"],"agent version (" _[pp][".Product Version"] ") do not match all lib versions: " _dllchktv "'") }
+ else { if ( !_missfl ) _creport(pp,"agent not detected in registry")
+ else { _dllerr(pp,"agent not detected in registry but some registry entries exist:")
+ _tframe("_dll_check_i1",pp,pp) } } }
+ #_______________________________________________
+ func _dll_check_i1(p,pp,p1,p2,p3, i) {
+ if ( _[p]["TYPE"]=="defdll" ) {
+ for ( i in _[p] ) { if ( i~/^\./ ) _dllerr(pp," " _[p]["REGPATH"] "\\" substr(i,2)) } } }
+ #_______________________________________________
+ func _dll_check_i0(p,R,pp,p2, i,i2,r,f,v,rs,d,tv,tf) {
+ if ( _[p]["TYPE"]=="defdll" ) {
+ r=toupper(_[p]["REGPATH"]); rs=0; tf=0; tv=""
+ for ( i in R ) {
+ if ( toupper(substr(i,1,length(r)))==r ) { if ( (_chka0=substr(i,1+length(r),1))=="" || _chka0=="\\" ) {
+ rs=1; _missfl=1; _[p]["." substr(gensub(/\....$/,"",1,i),i2=2+length(r),length(i)-i2+1)]=R[i]
+ if ( chka0!="" ) rs=1 } } } #{ rs=_missfl=1; _[p]["." gensub(/^([^\\]+\\)+(.*)\..../,"\\2","G",i)]=R[i] } }
+ if ( rs ) { if ( (i=".Install Path") in _[p] && (i=".Product Version") in _[p] ) { _[p]["STATUS"]="PRESENT"
+ f=_[p][".Install Path"]; v=_[p][".Product Version"]
+ if ( !(".Module" in _[p]) ) { _[pp][".Product Version"]=v; _VAR["HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR"]=f; _[pp]["AGENT"]=p; _creport("OK: DLL DETECTED(" v "): " substr(_[p]["NAME"],1,112)) }
+ else { if ( _dllchktv=="" ) _dllchktv=v
+ else if ( v!=_dllchktv ) return _dllerr(p,"different versions detected: " _dllchktv "!=" v "'")
+ ERRNO=""; if ( _th1(_[p]["DATA"]=_rdfile(f),ERRNO) ) { delete _[p]["DATA"]; return _dllerr(p,"read lib: " ERRNO,f) }
+ if ( v!=(_[p]["VERSION"]=_getfilever(f)) ) return _dllerr(p,"library file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'",f)
+ _creport(p,"OK: LIBRARY DETECTED(" v "): " substr(f,1,100)) } }
+ else { tf=1; _dllerr(p,"registry corrupt: `" i "' not present") } }
+ else _[p]["STATUS"]="MISSED" } }
+#_____________________________________________________________________________________________________
+######################################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _rdsafe(A,i,d) { if ( i in A ) return A[i]; return d }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #_____________________________________________________________________________
+ func _var(v,t) { if ( isarray(v) ) return _dumparr(v) _ln(t)
+ if ( v==0 && v=="" ) return _ln("- (ERRNO=" ERRNO ")") _ln(t)
+ return _ln(v "'") _ln(t) }
+ #_____________________________________________________________________________
+ func _dumpval(v,n) {
+ _dumpstr=_dumpstr (v=_ln((n==0 && n=="" ? "RET" : n) ": " (v==0 && v=="" ? "-" : v "'")))
+ return v }
+
+
+func _torexp(r) { return _subseqon(_TOREXPB0,gensub(/(^[ \t]+)|(([ \t]*(\\)+)+[ \t]*)|([ \t]+$)/,"\\4","G",_subseqoff(r,_TOREXPB0)),_TOREXPFN) }
+
+
+ #_______________________________________________
+ func _torexp_init() { _TOREXPFN[""] ="_strtorexp"
+ _TOREXPFN["~"] ="_torexp_rexp"
+ _TOREXPFN["="] ="_strtorexp"
+ _TOREXPFN[">"] ="_torexp_cmdstr"
+ _TOREXPFN["#"] ="_torexp_fmask"
+ _TOREXPFN["\""] ="_torexp_dqstr"
+ _TOREXPFN["'"] ="_torexp_sqstr"
+ }
+
+func _subseqoff(r,B) { patsplit(r,B,/\x84[^\x94]*\x94/); return gensub(/\x84[^\x94]*\x94/,"\x84","G",r) }
+
+func _subseqon(B,r,F, f,s,e,q,i,A) {
+ q=split(r,A,/\x84/); r=""; f=F[""]
+ for ( i=1; i<q; i++ ) { s=substr(e=B[i],2,1)
+ #_conl("curr r==`" r "': A[" i "]=`" A[i] "'")
+ #s=s in F ? _th0(F[s],_conl("handler `" F[s] "' for `" s "' ost=`" substr(e,3,length(e)-3) "'")) : _th0(F[""],_conl("default handler for `" s "'"))
+ s=s in F ? F[s] : F[""]
+ #_conl("`" f "'")
+ r=r @f(A[i]) @s(substr(e,3,length(e)-3)) }
+ return r @f(A[i]) }
+ #_______________________________________________
+ func _torexp_rexp(t) { return t }
+ #_______________________________________________
+ func _strtorexp(t) { gsub(/[\\\.\?\*\+\-\(\)\{\}\[\]\^\$\/\|]/,"\\\\&",t)
+ t=split(t,_TOREXP_STRA,/[\x00-\x1F]/,_TOREXP_STRB); _torexp_strt0=""
+ for ( _torexp_stri0=1; _torexp_stri0<t; _torexp_stri0++ ) _torexp_strt0=_torexp_strt0 _TOREXP_STRA[_torexp_stri0] "\\" _QASC[_TOREXP_STRB[_torexp_stri0]]
+ return _torexp_strt0 _TOREXP_STRA[_torexp_stri0] }
+
+ func _torexp_cmdstr(t) { return _strtorexp(gensub(/\^(.)/,"\\1","G",t)) }
+
+ func _torexp_fmask(t) { return gensub(/\\\*/,".*","G",gensub(/\\\?/,".?","G",_strtorexp(t))) }
+
+
+func _getfilever(f) { #############################################################
+ split(_cmd(_fileverpath " \"" f "\""),_GETFILEVERA0,/[ \t]+/)
+ if ( _GETFILEVERA0[5] ) return _GETFILEVERA0[5] }
+ #_____________________________________________________
+ BEGIN { _initfilever() }
+ func _initfilever() { _fileverpath ="\\\\CPU\\eGAWK\\LIB\\_filever\\_filever.exe" }
+
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _sharelist(D,h, q,c,l,A,B) { #################################################
+ delete D; c=_sharextool " \\\\" (h=="" ? h=ENVIRON["COMPUTERNAME"] : h) " 2>&1"
+ if ( match(c=_cmd(c),/\x0AShare[^\x0A]*Remark/) ) {
+ gsub(/(^[^-]*\x0D?\x0A-+\x0D?\x0A[ \t]*)|(\x0D?\x0AThe command completed successfully.*$)/,"",c)
+ l=RLENGTH-7; split(c,A,/([ \t]*\x0D?\x0A)+[ \t]*/)
+ for ( c in A ) if ( match(A[c],/((([^ \t:]+[ \t]+)*[^ \t:]+)[ \t]+)([A-Za-z])[ \t]*:/,B) && ++q ) D[B[2]]=A[c]~/\.\.\.$/ ? _sharepath(h,B[2]) : gensub(/[ \t\\\/]*$/,"\\\\",1,substr(A[c],1+B[1,"length"],l-B[1,"length"]))
+ return q }
+ return _rmtsharerr(h,c) }
+#_____________________________________________________________________________
+func _sharepath(h,s, A) { ###################################################
+ s=_sharextool " \\\\" (h=="" ? h=ENVIRON["COMPUTERNAME"] : h) "\\\"" s "\" 2>&1"
+ if ( match(s=_cmd(s),/\x0APath[ \t]+([^\x0D\x0A]+)/,_SHAREPATHA0) ) return gensub(/[ \t\\\/]*$/,"\\\\",1,_SHAREPATHA0[1])
+ return _rmtsharerr(h,s) }
+ #___________________________________________________________
+ func _rmtsharerr(h,t) { gsub(/[\x0D\x0A]+/,"",t)
+ if ( t~/^The command failed: 53/) ERRNO="host not found: \\\\" h
+ else ERRNO=t ": \\\\" h }
+ #_____________________________________________________
+ BEGIN { _initshare() }
+ func _initshare() { _sharextool ="\\\\CPU\\eGAWK\\LIB\\_share\\_share.exe" }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+func _extfn_init() { ##############################################################
+
+ _formatstrs_init(); _formatstrd_init(); _formatrexp_init()
+
+ _unformatstr_init()
+
+ _mac_init()
+
+}#__________________________________________________________________________________
+####################################################################################
+
+
+
+
+#___________________________________________________________________________________
+func _formatstrs(t) { _formatstrq0=split(t,_FORMATSTRA,/['\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+ for ( t=1; t<_formatstrq0; t++ ) _formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATSTRSESC[_FORMATSTRB[t]]
+ return _formatstrs0 _FORMATSTRA[t] }
+ #___________________________________________________________
+ func _formatstrs_init() { _defescarr(_FORMATSTRSESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+ _defescarr(_FORMATSTRSESC,"[\\\\']","\\")
+ _FORMATSTRSESC["\t"]="\\t" }
+#_____________________________________________________________________________
+func _formatstrd(t) { _formatstrq0=split(t,_FORMATSTRA,/["\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+ for ( t=1; t<_formatstrq0; t++ ) _formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATSTRDESC[_FORMATSTRB[t]]
+ return _formatstrs0 _FORMATSTRA[t] }
+ #___________________________________________________________
+ func _formatstrd_init() { _defescarr(_FORMATSTRDESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+ _defescarr(_FORMATSTRDESC,"[\\\\\"]","\\")
+ _FORMATSTRDESC["\t"]="\\t" }
+#_____________________________________________________________________________
+func _formatrexp(t) { _formatstrq0=split(t,_FORMATSTRA,/[\/\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+ for ( t=1; t<_formatstrq0; t++ ) _formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATREXPESC[_FORMATSTRB[t]]
+ return _formatstrs0 _FORMATSTRA[t] }
+ #___________________________________________________________
+ func _formatrexp_init() { _defescarr(_FORMATREXPESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+ _defescarr(_FORMATREXPESC,"\\/","\\")
+ _FORMATREXPESC["\t"]="\\t" }
+#___________________________________________________________
+func _defescarr(D,r,S, i,c,t) { if ( isarray(S) ) { for ( i=0; i<256; i++ ) { if ( (c=_CHR[i])~r ) { D[c]="\\" S[c]; t=t c }
+ else if ( D[c]=="" ) D[c]=c } }
+ else { for ( i=0; i<256; i++ ) { if ( (c=_CHR[i])~r ) { D[c]=S c; if ( S!="" ) t=t c }
+ else if ( D[c]=="" ) D[c]=c } } return t }
+
+
+#___________________________________________________________________________________
+func _unformatstr(t) { _formatstrq0=split(t,_FORMATSTRA,/(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/,_FORMATSTRB); _formatstrs0=""
+ for ( t=1; t<_formatstrq0; t++ ) _formatstrs0=_formatstrs0 _FORMATSTRA[t] (_FORMATSTRB[t] in _QESCHR ? _QESCHR[_FORMATSTRB[t]] : _QESCHR[toupper(substr(_FORMATSTRB[t],length(_FORMATSTRB[t])-1))])
+ return _formatstrs0 _FORMATSTRA[t] }
+ #___________________________________________________________
+ func _unformatstr_init( i) { for ( i=0; i<256; i++ ) _QESCHR["\\" _CHR[i]] =_CHR[i]
+ for ( i=0; i<256; i++ ) { _QESCHR[sprintf("%.2X",i)] =_CHR[i]
+ _QESCHR["\\" sprintf("%.3o",i)] =_CHR[i]
+ if ( i<8 ) _QESCHR["\\" sprintf("%.1o",i)] =_CHR[i]
+ if ( i<64 ) _QESCHR["\\" sprintf("%.2o",i)] =_CHR[i]
+ if ( i<16 ) _QESCHR["\\x" sprintf("%.1X",i)]=_QESCHR["\\x" sprintf("%.1x",i)] =_CHR[i] }
+ i="a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11
+ patsplit(i,_FORMATSTRA,/[^0-9]/,_FORMATSTRB)
+ for ( i in _FORMATSTRA ) _QESCHR["\\" _FORMATSTRA[i]]=_CHR[_FORMATSTRB[i]+0] }
+
+
+
+#___________________________________________________________________________________
+func _unformatrexp(t) { _formatstrq0=split(t,_FORMATSTRA,/(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/,_FORMATSTRB); _formatstrs0=""
+ for ( t=1; t<_formatstrq0; t++ ) _formatstrs0=_formatstrs0 _FORMATSTRA[t] (_FORMATSTRB[t] in _QESCHR ? _QESCREXP[_FORMATSTRB[t]] : _QESCREXP[toupper(substr(_FORMATSTRB[t],length(_FORMATSTRB[t])-1))])
+ return _formatstrs0 _FORMATSTRA[t] }
+ #___________________________________________________________
+ func _unformatrexp_init( i,a) { _formatstrs0="\\^$.[]|()*+?{}-sSwW<>yB`'"; delete _FORMATSTRB
+ for ( i=0; i<256; i++ ) _QESCREXP["\\" _CHR[i]] =index(_formatstrs0,_CHR[i]) ? "\\" _CHR[i] : _CHR[i]
+ for ( i=0; i<256; i++ ) { a=index(_formatstrs0,_CHR[i]) ? "\\" : ""
+ _QESCREXP[sprintf("%.2X",i)] =a _CHR[i]
+ _QESCREXP["\\" sprintf("%.3o",i)] =a _CHR[i]
+ if ( i<8 ) _QESCREXP["\\" sprintf("%.1o",i)] =a _CHR[i]
+ if ( i<64 ) _QESCREXP["\\" sprintf("%.2o",i)] =a _CHR[i]
+ if ( i<16 ) _QESCREXP["\\x" sprintf("%.1X",i)]=_QESCREXP["\\x" sprintf("%.1x",i)]=a _CHR[i] }
+ patsplit("a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11,_FORMATSTRA,/[^0-9]/,_FORMATSTRB)
+ for ( i in _FORMATSTRA ) _QESCREXP["\\" _FORMATSTRA[i]]=_CHR[_FORMATSTRB[i]+0] }
+#
+# /rexpstr/ -> datastr
+# (\x00\t\+)* -> 28 00 09 5B 2B 29
+#
+# unesc all non-rexp characters: replace unesc of rexp-characters but do not remove it: \* -> \*, \x2A -> \*, \052 -> \*, \\ -> \#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _mpudefaulthnd(F,D,C,p1,p2,p3) { _mpuretsub(D,_mpucc0) }
+
+
+
+
+
+func _mpupfxsubret(F,D,C,p1,p2,p3) { return 1 }
+
+func _mpusfxsubret(F,D,C,p1,p2,p3) { return -1 }
+
+func _mpuretsub(D,t) { _mpuacc=D[_mpuptr++]; _accmpu(D,t); return 1 }
+
+
+ func _mac_init() { _MACPFX["\x84"] ="_macpfx84"
+ _MACPFX[""] ="_mpupfxsubret"
+
+
+ _MACPFX84SFX["\x84"] ="_macpfx84"
+ _MACPFX84SFX["\x94"] ="_macsfx94"
+ _MACPFX84SFX[""] ="_mpusfxsubret"
+
+
+ _VLDMAXSTRING =1000000
+
+ }
+
+
+func _macpfx84(F,D,C,p1,p2,p3) { return _mpusub(_MACPFX84SFX,D,C,D[_mpuptr++],p1,p2,p3) }
+
+
+
+
+
+func _macsfx94(F,D,C,p1,p2,p3) { return _mpuretsub(D,_handle8494(_mpuacc)) }
+
+func _handle8494(t) { return gensub(/(.)/,".\\1","G",t) }
+
+
+func _mpu(t,F,p1,p2,p3, D,C) {
+ if ( patsplit(t,C,/[\x84\x93\x94]/,D)>0 ) { _conline("CODE"); _conl(); _conl(_dumparr(C))
+ _conline("DATA"); _conl(); _conl(_dumparr(D))
+
+ _mpuptr=0; _mpucc0=""; _mpusub(F,D,C,D[_mpuptr++],p1,p2,p3)
+ return _mpuacc }
+ return t }
+
+func _mpusub(F,D,C,d,p1,p2,p3, q) {
+ q=D[_ARRLEN]
+ if ( _VLDMAXSTRING<length(d) ) { D[--D[_ARRLEN]]=d; _mpuacc="" }
+ else _mpuacc=d
+ d=_mpucc0
+ _conl("_mpusub enter: in `" _mpuacc "' / _mpuptr=" _mpuptr "'")
+ do { if ( (_mpucc0=C[_mpuptr]) in F ) { if ( isarray(F[_mpucc0]) ) _mpufn0=F[_mpucc0]
+ _conl("FN: `" _mpucc0 "' > CALL: `" (_mpufn0) "' : _mpuacc=" _mpuacc "'") }
+ else _mpufn0="_mpudefaulthnd" } while ( !_accmpu(D,_mpuacc,@_mpufn0(F,D,C,p1,p2,p3)) )
+ if ( _mpufn0==-1 ) { _conl("WARNING: unclosed expression: `" d _mpuacc"'")
+ _mpuacc=d _mpuacc }
+ _retarrm(D,q,"",_mpufn0==-1 ? _th0(d,_mpusubwrng("WARNING: unclosed expression",d _mpuacc)) : "")
+ # collect: _mpuacc=_retarr(D) _mpuacc
+ _conl("mpusub exit: _mpuacc: `" _mpuacc "'") }
+
+
+
+
+
+
+func _accmpu(A,a,n) { if ( n ) return _mpufn0=n
+ if ( _mpuacc ) { if ( _VLDMAXSTRING<length(_mpuacc)+length(a) ) {
+ if ( a ) { if ( _VLDMAXSTRING<length(_mpuacc) ) { A[--A[_ARRLEN]]=a; A[--A[_ARRLEN]]=_mpuacc }
+ else A[--A[_ARRLEN]]=a _mpuacc }
+ else A[--A[_ARRLEN]]=_mpuacc
+ _mpuacc="" }
+ else _mpuacc=a _mpuacc }
+ else _mpuacc=a }
+
+
+
+
+func _acc(A,a,t) { if ( t ) { if ( _VLDMAXSTRING<length(t)+length(a) ) {
+ if ( a ) { if ( _VLDMAXSTRING<length(t) ) { A[--A[_ARRPTR]]=a; A[--A[_ARRPTR]]=t }
+ else A[--A[_ARRPTR]]=a t }
+ else A[++A[_ARRLEN]]=t
+ return "" }
+ return a t }
+ return a }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _shortcut(D,S) { #############################################################
+ if ( isarray(D) ) { if ( isarray(S) ) { _addarrmask(D,S,_SHORTCUTWSTRUC) } # array,array2* - copy from array2 to array shorcut-specific elements
+ else if ( S==0 && S=="" ) { _addarrmask(D,_SHORTCUTDEFAULT,_SHORTCUTWSTRUC) } # array* - define shortcut-specific elements in array by default values
+ else if ( _isnotfileptr(S) ) { _addarrmask(D,_[S],_SHORTCUTWSTRUC) } # array,ptr* - copy from array _[ptr] to array shorcut-specific elements
+ else if ( _rd_shortcut(D,S) ) return } # array,filepath* - define in array shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+ else if ( D==0 && D=="" ) return _NOP # -* - no action(return -)
+ else if ( _isnotfileptr(D) ) { if ( isarray(S) ) { _addarrmask(_[D],S,_SHORTCUTWSTRUC) } # ptr,array* - copy from array to array _[ptr] shorcut-specific elements
+ else if ( S==0 && S=="" ) { _addarrmask(_[D],_SHORTCUTDEFAULT,_SHORTCUTWSTRUC) } # ptr* - define shortcut-specifc elements in array _[ptr] by default values
+ else if ( _isnotfileptr(S) ) { _addarrmask(_[D],_[S],_SHORTCUTWSTRUC) } # ptr,ptr2* - copy from array _[ptr2] to array _[ptr] shorcut-specific elements
+ else if ( _rd_shortcut(_[D],S) ) return } # ptr,filepath* - define in array _[ptr] shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+ else { if ( isarray(S) && _wr_shortcut(D,S) ) return # filepath,array* - [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array(save shortcut)
+ else if ( S==0 && S=="" && _wr_shortcut(D,_SHORTCUTDEFAULT) ) return # filepath* - [over]write shorcut file filepath; shortcut parameters will be defined by default values
+ else if ( _isnotfileptr(S) && _wr_shortcut(D,_[S]) ) return # filepath,ptr* - [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array _[ptr](save shortcut)
+ else if ( _rd_shortcut(_SHRTCUTA1,S) || _wr_shortcut(D,_SHRTCUTA1) ) return } # filepath,filepath2* - [over]write shorcut file filepath; shortcut parameters will be defined from shortcut file filepath2(copy shortcut)
+ return 1 }
+ #___________________________________________________________
+ func _wr_shortcut(f,S) { if ( (_shrtcutf0=_filepath(f)) ) {
+ ERRNO=""; _shrtcuta0=_shortcut_fpath " /A:C /F:\"" _shrtcutf0 "\" 2>&1"
+ for ( f in _SHORTCUTWSTRUC ) if ( f in S ) _shrtcuta0=_shrtcuta0 " " _SHORTCUTWSTRUC[f] "\"" gensub(/(\\?)$/,"\\1\\1",1,S[f]) "\""
+ if ( _shortcut_nerr(_cmd(_shrtcuta0),_shrtcutf0) ) return }
+ return ERRNO ? ERRNO="write shortcut: " ERRNO : _NOP }
+ #___________________________________________________________
+ func _rd_shortcut(D,f) { if ( (_shrtcutf0=_filepath(f)) && _shortcut_nerr(_shrtcuta0=_cmd(_shortcut_fpath " /A:Q /F:\"" _shrtcutf0 "\" 2>&1"),_shrtcutf0) ) {
+ ERRNO=""; split(_shrtcuta0,_SHRTCUTA0,/\x0D?\x0A/)
+ for ( _shrtcuta0 in _SHRTCUTA0 ) for ( f in _SHORTCUTRSTRUC ) if ( match(_SHRTCUTA0[_shrtcuta0],"^" f) ) D[_SHORTCUTRSTRUC[f]]=substr(_SHRTCUTA0[_shrtcuta0],1+RLENGTH) }
+ return ERRNO ? ERRNO="read shortcut: " ERRNO : _NOP }
+ #_____________________________________________________
+ func _shortcut_nerr(t,s, A) { if ( match(t,/\x0ASystem error (-?[0-9]+)[^\x0D\x0A]*[\x0D\x0A]+([^\x0D\x0A]+)/,A) ) {
+ ERRNO=(A[1] in _SHORTCUTERR ? _SHORTCUTERR[A[1]] : A[2] in _SHORTCUTERR ? _SHORTCUTERR[A[2]] : tolower(gensub(/^(The )?(((.*)\.$)|(.*[^\.]$))/,"\\4\\5","G",A[2])) "(" A[1] ")") (s ? ": `" s "'" : "") }
+ else return 1 }
+ #________________________________________________
+ func _shortcut_init( A,B,q) {
+ _SHORTCUTERR[2] ="file not found"
+ _SHORTCUTERR[3] ="no such filepath"
+ _SHORTCUTERR["The system cannot find the file specified."] ="no such filepath"
+ _SHORTCUTERR[5] ="file is folder"
+ _SHORTCUTERR["Access is denied."] ="file is folder"
+ _SHORTCUTERR[123] ="filepath syntax error"
+ _SHORTCUTERR["The filename, directory name, or volume label syntax is incorrect."] ="filepath syntax error"
+ q= "target /T: TargetPath= target? ; _target TargetPathExpanded= ; parameters /P: Arguments= paraneters? ; _parameters ArgumentsExpanded= ; startdir /W: WorkingDirectory= startdir? ; _startdir WorkingDirectoryExpanded= ; runstyle /R: RunStyle= 1 ; icon,index /I: IconLocation= icon,index? ; xicon,index IconLocationExpanded= ; shortcut key /H: HotKey= 0 ; description /D: Description= _env4: default shortcut "
+ split(q,_SHRTCUTA0,/[ \t]*;[ \t]*/)
+ for ( q in _SHRTCUTA0 ) if ( match(_SHRTCUTA0[q],/^([^\t]+)\t+([^\t]+)(\t+([^\t]+)(\t+([^\t]+))?)?/,B) ) {
+ if ( B[3]=="" ) _SHORTCUTRSTRUC[B[2]]=B[1]
+ else if ( B[5]=="" ) { _SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]]=B[1]]=B[2]; delete _SHORTCUTDEFAULT[B[1]] }
+ else { _SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]]=B[1]]=B[2]; _SHORTCUTDEFAULT[B[1]]=B[6] } }
+ else _fatal("_shortcut.init: _shortcut_struc: syntax error: `" _SHRTCUTA0[q] "'")
+ _SHRTCUTA1[""]; delete _SHRTCUTA1[""]
+ _shortcut_fpath="\\\\localhost\\eGAWK\\LIB\\_shortcut\\_shortcut.exe" }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+END{ ###############################################################################
+
+ if ( _gawk_scriptlevel<1 ) {
+ close(_errlog_file)
+ p=_Zimport(_rdfile(_errlog_file),_N())
+ if ( (t=_get_errout(p))!="" ) _expout(t,"/dev/stderr") } }
+#___________________________________________________________________________________
+####################################################################################
+
+#_____________________________________________________________________________
+func _expout(t,d, a,b) { ####################################################
+ a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+ print t > (d ? d : (d=_errlog_file)); fflush(d)
+ BINMODE=a; ORS=b }
+#_______________________________________________________________________
+func _fatal(t,d, A) { #################################################
+ if ( _ERRLOG_FF ) {
+ A["TYPE"]="FATAL"; A["TEXT"]=t
+ _log(A,d) }
+ if ( !d ) exit }
+#_______________________________________________________________________
+func _error(t,d, A) { #################################################
+ if ( _ERRLOG_EF ) {
+ A["TYPE"]="ERROR"; A["TEXT"]=t
+ _log(A,d) } }
+#_______________________________________________________________________
+func _warning(t,d, A) { ###############################################
+ if ( _ERRLOG_WF ) {
+ A["TYPE"]="WARNING"; A["TEXT"]=t
+ _log(A,d) } }
+#_______________________________________________________________________
+func _info(t,d, A) { ##################################################
+ if ( _ERRLOG_IF ) {
+ A["TYPE"]="INFO"; A["TEXT"]=t
+ _log(A,d) } }
+#_______________________________________________________________________
+func _verb(t,d, A) { ##################################################
+ if ( _ERRLOG_VF ) {
+ A["TYPE"]="VERB"; A["TEXT"]=t
+ _log(A,d) } }
+#_______________________________________________________________________
+func _trace(t,d, A) { #################################################
+ if ( _ERRLOG_TF ) {
+ A["TYPE"]="TRACE"; A["TEXT"]=t
+ _log(A,d) } }
+#_________________________________________________________________
+func _log(A,p, a,B) { ###########################################
+ if ( isarray(A) ) {
+ A["TIME"]=_getime(); A["DATE"]=_getdate()
+ if ( p ) {
+ _tLOG[p=_wLCHLD(p,_N())][""]; delete _tLOG[p][""]
+ _movarr(_tLOG[p],A)
+ return p }
+ _expout("_ERRLOG: " _Zexparr(A) "\x0A") }
+ else {
+ B["TEXT"]=A; B["TYPE"]=""
+ return _log(B,p) } }
+#_______________________________________________________________________
+func _yexport(p) { #####################################################
+ return _tframe("_yexport_i0",p) }
+#_______________________________________________________________________
+func _yexport_i0(p,p0,p1,p2) {
+ if ( p in _tLOG ) return "_ERRLOG: " _Zexparr(_tLOG[p]) "\x0A"
+ if ( p in _tSTR ) {
+ p=_tSTR[p]; gsub(/\x1B/,"\x1B\x3B",p); gsub(/\x0A/,"\x1B\x3A",p)
+ return p "\x0A" } }
+#_____________________________________________________________________________
+func _Zimport(t,p,A, c,i,n,B) { ##############################################
+ if ( p ) {
+ c=split(t,B,/\x0A/)
+ for ( i=1; i<=c; i++ ) {
+ if ( (t=B[i])=="" ) continue
+ gsub(/\x1B\x3A/,"\x0A",t)
+ if ( match(t,/^_ERRLOG: /) ) {
+ _tLOG[n=_wLCHLD(p,_N())][""]; delete _tLOG[n][""]
+ _Zimparr(_tLOG[n],substr(t,10)) }
+ else if ( (t=_pass(_IMPORT,t,p,A))!="" ) {
+ gsub(/\x1B\x3B/,"\x1B",t); _wLCHLD(p,_N(_tSTR,t)) } }
+ return p }
+ else _expout(t) }
+#_____________________________________________________________________________
+func _export_data(t,i, A) { #################################################
+ A["DATA"]=t; A["ID"]=i
+ _expout("_DATA: " _Zexparr(A) "\x0A") }
+#_________________________________________________________________
+BEGIN { _inspass(_IMPORT,"_import_data") }
+
+func _import_data(t,p,p2, a) {
+ if ( match(t,/^_DATA: /) ) {
+ _tDATA[a=_wLCHLD(p,_N())][""]; delete _tDATA[a][""]
+ _Zimparr(_tDATA[a],substr(t,8))
+ _conl("DATA: `" _tDATA[a]["ID"] "':`" _tDATA[a]["DATA"] "'")
+ return "" }
+ return t }
+
+#_____________________________________________________________________________
+func _get_errout(p) { #######################################################
+ return _tframe("_get_errout_i0",p) }
+#_______________________________________________________________________
+func _get_errout_i0(p, t,n,a) {
+ return p in _tLOG ? (_get_errout_i1(p) _get_errout_i3(p)) : "" }
+#_________________________________________________________________
+func _get_errout_i1(p, t,n,a) {
+ if ( p in _tLOG ) {
+ n=""
+ if ( _tLOG[p]["TYPE"] ) {
+ n=_tLOG[p]["TYPE"] ": " _get_errout_i2(p)
+ if ( match(_tLOG[p]["TEXT"],/\x1F/) ) {
+ t=n; gsub(/[^\t]/," ",t)
+ return _ln(n substr(_tLOG[p]["TEXT"],1,RSTART-1)) _ln(t substr(_tLOG[p]["TEXT"],RSTART+1)) } }
+ return _ln(n _tLOG[p]["TEXT"]) } }
+#_______________________________________________________________________
+func _get_errout_i2(p) {
+ return "FILE" in _tLOG[p] ? (_tLOG[p]["FILE"] ("LINE" in _tLOG[p] ? ("(" _tLOG[p]["LINE"] ")") : "") ": ") : "" }
+#_______________________________________________________________________
+func _get_errout_i3(p, t,ts,cl,cp,cr,a,b) {
+ if ( "LSTR" in _tLOG[p] ) {
+ t=_tLOG[p]["FULLSTR"]; ts=_tLOG[p]["TS"]; cp="^"
+ if ( "CSTR" in _tLOG[p] ) {
+ cr=_tLOG[p]["CSTR"]
+ cl=_tLOG[p]["CLSTR"]
+ if ( "CPSTR" in _tLOG[p] ) cp=_tLOG[p]["CPSTR"] }
+ cr=substr(cr,length(cl)+length(cp)+1)
+ return _ln(_tabtospc(t,ts)) _ln(_getchrln(" ",a=length(_tabtospc(_tLOG[p]["LSTR"],ts))) _getchrln("-",b=length(_tabtospc(cl,ts,a))) _getchrln("^",b=length(_tabtospc(cp,ts,a=a+b))) _getchrln("-",length(_tabtospc(cr,ts,a+b)))) } }
+#_____________________________________________________________________________
+func _get_logout(p) { #######################################################
+ return _tframe("_get_logout_i0",p) }
+#_______________________________________________________________________
+func _get_logout_i0(p, t,n,a) {
+ if ( p in _tLOG ) {
+ n= ("DATE" in _tLOG[p] ? (_tLOG[p]["DATE"] " ") : "") ("TIME" in _tLOG[p] ? (_tLOG[p]["TIME"] " ") : "")
+ if ( _tLOG[p]["TYPE"] ) {
+ n=n _tLOG[p]["TYPE"] ": " ("FILE" in _tLOG[p] ? ( _tLOG[p]["FILE"] ("LINE" in _tLOG[p] ? ("(" _tLOG[p]["LINE"] ")") : "") ": ") : "")
+ if ( match(_tLOG[p]["TEXT"],/\x1F/) ) {
+ t=n; gsub(/[^\t]/," ",t)
+ return _ln(n substr(_tLOG[p]["TEXT"],1,RSTART-1)) _ln(t substr(_tLOG[p]["TEXT"],RSTART+1)) } }
+ return _ln(n _tLOG[p]["TEXT"]) } }
+#___________________________________________________________________________________
+
+
+####################################################################################
+
+
+#_____________________________________________________________________________
+func _N(F,v, p) { ###########################################################
+ for ( p in _UIDS ) { delete _UIDS[p]; return _nN_i0(p,F,v) }
+ return _nN_i0(_tgenuid(),F,v) }
+#_______________________________________________________________________
+func _n(F,v, p) { #####################################################
+ for ( p in _UIDSDEL ) { delete _UIDSDEL[p]
+ delete _ptr[p]
+ delete _tPREV[p]; delete _tPARENT[p]; delete _tNEXT[p]
+ delete _tFCHLD[p]; delete _tQCHLD[p]; delete _tLCHLD[p]
+ delete _TMP0[p]; delete _TMP1[p]
+ delete _tLINK[p]; delete _tCLASS[p]
+ return _nN_i0(p,F,v) }
+ for ( p in _UIDS ) { delete _UIDS[p]; return _nN_i0(p,F,v) }
+ return _nN_i0(_tgenuid(),F,v) }
+#_____________________________________________________
+func _nN_i0(p,F,v) {
+ _[p][""]; delete _[p][""]; _ptr[p][""]; delete _ptr[p][""]
+ _TMP0[p][_ARRLEN]=_TMP1[p][_ARRLEN]=0
+ if ( isarray(F) ) { delete F[p]
+ if ( isarray(v) ) { F[p][""]; delete F[p][""]; _copyarr(F[p],v) }
+ else if ( !(v==0 && v=="") ) F[p]=v }
+ else { if ( !(F==0 && F=="") ) { if ( isarray(v) ) { _[p][F][""]; delete _[p][F][""]; _copyarr(_[p][F],v) }
+ else if ( v==0 && v=="" ) _mpu(F,p)
+ else _[p][F]=v } }
+ return p }
+#_____________________________________________________
+# F v action
+#-----------------------------------------------------
+# - * no additional action
+# A B delete A[p] and define A[p] as array; copy array B to array A[p]
+# A - delete A[p]
+# A "*" delete A[p]; A[p]="*"
+# "*" B define _[p]["*"] as array; copy array B to array _[p]["*"]
+# "*" - run _mpu program "*" for `p
+# "*0" "*1" _[p]["*0"]="*1"
+#___________________________________________________________
+func _tgenuid( c) { for ( _uidcntr in _UIDARR1 ) { delete _UIDARR1[_uidcntr]; for ( c in _UIDARR0 ) _UIDS[_uidcntr c]; delete _UIDS[_uidcntr c]; return _uidcntr c }
+ return _fatal("_tUID: Out of UID range") }
+#_____________________________________________________
+func _tgenuid_init( a,b,A) {
+ _ptrlength =4
+ a= "\x92\x93\x94\x95\x96\x97\x98\x99\x9A" "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7" "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF" "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF" "\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"
+ split(a,A,""); for (a in A) for (b in A) _UIDARR0[A[a] A[b]] _UIDARR1[A[a] A[b]]; _uidcntr=A[a] A[b] }
+
+#_____________________________________________________________________________
+func _tdel(p, i) { ##########################################################
+ if ( p in _ ) {
+ _texclude(p)
+ for ( i in _ptr[p] ) { if ( isarray(_ptr[p][i]) ) _tdel_i1(_ptr[p][i])
+ else if ( (i=_ptr[p][i]) ) _tdel(i) }
+ if ( p in _tFCHLD ) { i=_tFCHLD[p]; do { i=(i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i) } while ( i ) }
+ delete _[p]; _UIDSDEL[p] } }
+#_____________________________________________________
+func _tdel_i0(p, i) {
+ for ( i in _ptr[p] ) { if ( isarray(_ptr[p][i]) ) _tdel_i1(_ptr[p][i])
+ else if ( (i=_ptr[p][i]) ) _tdel(i) }
+ if ( p in _tFCHLD ) { i=_tFCHLD[p]; do { i=(i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i) } while ( i ) }
+ delete _[p]; _UIDSDEL[p] }
+#_____________________________________________________
+func _tdel_i1(A, i) {
+ for ( i in A ) { if ( isarray(A[i]) ) _tdel_i1(A[i])
+ else if ( (i=A[i]) ) _tdel(i) } }
+#_____________________________________________________________________________
+func _texclude(p, v,pp) { ################################################### # TEST!!!
+ if ( p in _ ) {
+ if ( p in _tPARENT ) {
+ pp=_tPARENT[p]; delete _tPARENT[p]
+ if ( p in _tPREV ) {
+ if ( p in _tNEXT ) { _tPREV[_tNEXT[v]=_tNEXT[p]]=v=_tPREV[p]; delete _tNEXT[p] }
+ else delete _tNEXT[_tLCHLD[pp]=_tPREV[p]]
+ delete _tPREV[p] }
+ else {
+ if ( p in _tNEXT ) { delete _tPREV[_tFCHLD[pp]=_tNEXT[p]]; delete _tNEXT[p] }
+ else { delete _tFCHLD[pp]; delete _tLCHLD[pp]; delete _tQCHLD[pp]; return p } }
+ --_tQCHLD[pp] }
+ else {
+ if ( p in _tPREV ) {
+ if ( p in _tNEXT ) { _tPREV[_tNEXT[v]=_tNEXT[p]]=v=_tPREV[p]; delete _tNEXT[p] }
+ else delete _tNEXT[_tPREV[p]]
+ delete _tPREV[p] }
+ else if ( p in _tNEXT ) { delete _tPREV[_tNEXT[p]]; delete _tNEXT[p] } }
+ return p } }
+#_______________________________________________________________________
+func _rFBRO(p) { ######################################################
+ if ( p ) {
+ if ( p in _tPARENT ) {
+ return _tFCHLD[_tPARENT[p]] }
+ while ( p in _tPREV ) {
+ p=_tPREV[p] }
+ return p }
+ return p }
+#_________________________________________________________________
+func _wFBRO(p,v ,a) { ###########################################
+ if ( p ) {
+ if ( v ) {
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( p in _tPARENT ) {
+ p=_tPARENT[p]
+ if ( v in _tNEXT ) {
+ if ( v in _tPREV ) {
+ _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v]; delete _tPREV[v]
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) {
+ return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+ --_tQCHLD[a] } }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tPREV[_tFCHLD[a]=_tNEXT[v]]; --_tQCHLD[a] }
+ else {
+ delete _tPREV[_tNEXT[v]] } }
+ ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v }
+ else {
+ if ( v in _tPREV ) {
+ if ( v in _tPARENT ) {
+ delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+ if ( p==a ) {
+ delete _tPREV[v]
+ return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+ --_tQCHLD[a] }
+ else {
+ delete _tNEXT[_tPREV[v]] }
+ delete _tPREV[v] }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tFCHLD[a]; delete _tLCHLD[a]; delete _tQCHLD[a] } }
+ ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v } }
+ else {
+ while ( p in _tPREV ) {
+ p=_tPREV[p] }
+ if ( v in _tPREV ) {
+ if ( v in _tPARENT ) {
+ --_tQCHLD[a=_tPARENT[v]]; delete _tPARENT[v]
+ if ( v in _tNEXT ) {
+ _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v] }
+ else {
+ delete _tNEXT[_tLCHLD[a]=_tPREV[v]] } }
+ else {
+ if ( v in _tNEXT ) {
+ _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v] }
+ else {
+ delete _tNEXT[_tPREV[v]] } }
+ delete _tPREV[v] }
+ else {
+ if ( p==v ) { return v }
+ if ( v in _tPARENT ) {
+ if ( v in _tNEXT ) {
+ delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]; --_tQCHLD[a] }
+ else {
+ delete _tLCHLD[a=_tPARENT[v]]; delete _tFCHLD[a]; delete _tQCHLD[a] }
+ delete _tPARENT[v] }
+ else {
+ if ( v in _tNEXT ) {
+ delete _tPREV[_tNEXT[v]] } } }
+ return _tPREV[_tNEXT[v]=p]=v } }
+ else {
+ if ( v==0 ) {
+ return v } ######################## p=ptr, v=0
+ return v } } ######################## p=ptr, v=""
+ else {
+ if ( p==0 ) return v ######################## p=0
+ if ( v ) return _texclude(v) ######################## p="", v=ptr - exclude v
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rPREV(p) { ######################################################
+ if ( (p) && (p in _tPREV) ) {
+ return _tPREV[p] }
+ return "" }
+#_________________________________________________________________
+func _wPREV(p,v, a,b) { #########################################
+ if ( p ) {
+ if ( v ) {
+ if ( p==v ) { return v } ######################## p=v=ptr
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( v in _tNEXT ) {
+ if ( p==(a=_tNEXT[v]) ) { return v }
+ if ( v in _tPREV ) {
+ _tNEXT[_tPREV[a]=_tPREV[v]]=a
+ if ( v in _tPARENT ) {
+ --_tQCHLD[_tPARENT[v]] } }
+ else {
+ delete _tPREV[a]
+ if ( v in _tPARENT ) {
+ _tFCHLD[b=_tPARENT[v]]=a
+ --_tQCHLD[b] } } }
+ else {
+ if ( v in _tPREV ) {
+ if ( v in _tPARENT ) {
+ delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+ --_tQCHLD[a] }
+ else {
+ delete _tNEXT[_tPREV[v]] } }
+ else {
+ if ( v in _tPARENT ) {
+ delete _tLCHLD[a=_tPARENT[v]]; delete _tFCHLD[a]; delete _tQCHLD[a] } } }
+ if ( p in _tPREV ) {
+ _tNEXT[_tPREV[v]=_tPREV[p]]=v
+ if ( p in _tPARENT ) {
+ ++_tQCHLD[_tPARENT[v]=_tPARENT[p]] }
+ else {
+ delete _tPARENT[v] } }
+ else {
+ delete _tPREV[v]
+ if ( p in _tPARENT ) {
+ ++_tQCHLD[_tPARENT[_tFCHLD[a]=v]=a=_tPARENT[p]] }
+ else {
+ delete _tPARENT[v] } }
+ return _tPREV[_tNEXT[v]=p]=v }
+ else {
+ if ( v==0 ) {
+ return v } ######################## p=ptr, v=0
+ return v } } ######################## p=ptr, v=""
+ else {
+ if ( p==0 ) return v ######################## p=0
+ if ( v ) return _texclude(v) ######################## p="", v=ptr - exclude v
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rPARENT(p) { ####################################################
+ if ( (p) && (p in _tPARENT) ) {
+ return _tPARENT[p] }
+ return "" }
+#_________________________________________________________________
+func _wPARENT(p,v) { ############################################
+ return v }
+#_______________________________________________________________________
+func _rFCHLD(p) { #####################################################
+ if ( (p) && (p in _tFCHLD) ) {
+ return _tFCHLD[p] }
+ return "" }
+#_________________________________________________________________
+func _wFCHLD(p,v, a) { ##########################################
+ if ( p ) {
+ if ( v ) {
+ if ( p==v ) { return v } ######################## p=v=ptr
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( v in _tNEXT ) {
+ if ( v in _tPREV ) {
+ _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v]; delete _tPREV[v]
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) {
+ return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+ --_tQCHLD[a] } }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tPREV[_tFCHLD[a]=_tNEXT[v]]; --_tQCHLD[a] }
+ else {
+ delete _tPREV[_tNEXT[v]] } }
+ if ( p in _tFCHLD ) {
+ ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v }
+ delete _tNEXT[v] }
+ else {
+ if ( v in _tPREV ) {
+ if ( v in _tPARENT ) {
+ delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+ if ( p==a ) {
+ delete _tPREV[v]
+ return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+ --_tQCHLD[a] }
+ else {
+ delete _tNEXT[_tPREV[v]] }
+ delete _tPREV[v] }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tFCHLD[a]; delete _tLCHLD[a]; delete _tQCHLD[a] } }
+ if ( p in _tFCHLD ) {
+ ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v } }
+ _tQCHLD[p]=1; return _tFCHLD[_tPARENT[v]=p]=_tLCHLD[p]=v }
+ else {
+ if ( v==0 ) {
+ if ( p in _tFCHLD ) { ######################## p=ptr, v=0 > delete all chld
+ v=_tFCHLD[p]
+ delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+ do{
+ delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+ return v } } ######################## p=ptr, v="" > ignore action
+ else {
+ if ( p==0 ) return v ######################## p=0
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rLCHLD(p) { #####################################################
+ if ( (p) && (p in _tLCHLD) ) {
+ return _tLCHLD[p] }
+ return "" }
+#_________________________________________________________________
+func _wLCHLD(p,v, a) { ##########################################
+ if ( p ) {
+ if ( v ) {
+ if ( p==v ) { return v } ######################## p=v=ptr
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( v in _tPREV ) {
+ if ( v in _tNEXT ) {
+ _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v]; delete _tNEXT[v]
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) {
+ return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+ --_tQCHLD[a] } }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tNEXT[_tLCHLD[a]=_tPREV[v]]; --_tQCHLD[a] }
+ else {
+ delete _tNEXT[_tPREV[v]] } }
+ if ( p in _tLCHLD ) {
+ ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v }
+ delete _tPREV[v] }
+ else {
+ if ( v in _tNEXT ) {
+ if ( v in _tPARENT ) {
+ delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+ if ( p==a ) {
+ delete _tNEXT[v]
+ return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+ --_tQCHLD[a] }
+ else {
+ delete _tPREV[_tNEXT[v]] }
+ delete _tNEXT[v] }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tLCHLD[a]; delete _tFCHLD[a]; delete _tQCHLD[a] } }
+ if ( p in _tLCHLD ) {
+ ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v } }
+ _tQCHLD[p]=1; return _tLCHLD[_tPARENT[v]=p]=_tFCHLD[p]=v }
+ else {
+ if ( v==0 ) {
+ if ( p in _tFCHLD ) { ######################## p=ptr, v=0 > delete all chld
+ v=_tFCHLD[p]
+ delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+ do{
+ delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+ return v } } ######################## p=ptr, v="" > ignore action
+ else {
+ if ( p==0 ) return v ######################## p=0
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rQCHLD(p) { #####################################################
+ if ( (p) && (p in _tQCHLD) ) {
+ return _tQCHLD[p] }
+ return "" }
+#_________________________________________________________________
+func _wQCHLD(p,v) { #############################################
+ if ( p ) {
+ if ( v ) { } ######################## p=ptr, v=ptr
+ else {
+ if ( v==0 ) {
+ if ( p in _tFCHLD ) { ######################## p=ptr, v=0 > delete all chld
+ v=_tFCHLD[p]
+ delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+ do{
+ delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+ return v } } ######################## p=ptr, v="" > ignore action
+ else {
+ if ( p==0 ) {
+ return v } ######################## p=0
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rNEXT(p) { ######################################################
+ if ( (p) && (p in _tNEXT) ) {
+ return _tNEXT[p] }
+ return "" }
+#_________________________________________________________________
+func _wNEXT(p,v, a,b) { #########################################
+ if ( p ) {
+ if ( v ) {
+ if ( p==v ) { return v } ######################## p=v=ptr
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( v in _tPREV ) {
+ if ( p==(a=_tPREV[v]) ) { return v }
+ if ( v in _tNEXT ) {
+ _tPREV[_tNEXT[a]=_tNEXT[v]]=a
+ if ( v in _tPARENT ) {
+ --_tQCHLD[_tPARENT[v]] } }
+ else {
+ delete _tNEXT[a]
+ if ( v in _tPARENT ) {
+ _tLCHLD[b=_tPARENT[v]]=a
+ --_tQCHLD[b] } } }
+ else {
+ if ( v in _tNEXT ) {
+ if ( v in _tPARENT ) {
+ delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+ --_tQCHLD[a] }
+ else {
+ delete _tPREV[_tNEXT[v]] } }
+ else {
+ if ( v in _tPARENT ) {
+ delete _tFCHLD[a=_tPARENT[v]]; delete _tLCHLD[a]; delete _tQCHLD[a] } } }
+ if ( p in _tNEXT ) {
+ _tPREV[_tNEXT[v]=_tNEXT[p]]=v
+ if ( p in _tPARENT ) {
+ ++_tQCHLD[_tPARENT[v]=_tPARENT[p]] }
+ else {
+ delete _tPARENT[v] } }
+ else {
+ delete _tNEXT[v]
+ if ( p in _tPARENT ) {
+ ++_tQCHLD[_tPARENT[_tLCHLD[a]=v]=a=_tPARENT[p]] }
+ else {
+ delete _tPARENT[v] } }
+ return _tNEXT[_tPREV[v]=p]=v }
+ else {
+ if ( v==0 ) {
+ return v } ######################## p=ptr, v=0
+ return v } } ######################## p=ptr, v=""
+ else {
+ if ( p==0 ) return v ######################## p=0
+ if ( v ) return _texclude(v) ######################## p="", v=ptr - exclude v
+ return v } } ######################## p="", !v
+#_______________________________________________________________________
+func _rLBRO(p) { ######################################################
+ if ( p ) {
+ if ( p in _tPARENT ) {
+ return _tLCHLD[_tPARENT[p]] }
+ while ( p in _tNEXT ) {
+ p=_tNEXT[p] }
+ return p }
+ return p }
+#_________________________________________________________________
+func _wLBRO(p,v ,a) { ###########################################
+ if ( p ) {
+ if ( v ) {
+ for ( a=p; a in _tPARENT; ) {
+ if ( (a=_tPARENT[a])==v ) {
+ return v } } ######################## v is parentesis of p
+ if ( p in _tPARENT ) {
+ p=_tPARENT[p]
+ if ( v in _tPREV ) {
+ if ( v in _tNEXT ) {
+ _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v]; delete _tNEXT[v]
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) {
+ return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+ --_tQCHLD[a] } }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tNEXT[_tLCHLD[a]=_tPREV[v]]; --_tQCHLD[a] }
+ else {
+ delete _tNEXT[_tPREV[v]] } }
+ ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v }
+ else {
+ if ( v in _tNEXT ) {
+ if ( v in _tPARENT ) {
+ delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+ if ( p==a ) {
+ delete _tNEXT[v]
+ return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+ --_tQCHLD[a] }
+ else {
+ delete _tPREV[_tNEXT[v]] }
+ delete _tNEXT[v] }
+ else {
+ if ( v in _tPARENT ) {
+ if ( p==(a=_tPARENT[v]) ) { return v }
+ delete _tLCHLD[a]; delete _tFCHLD[a]; delete _tQCHLD[a] } }
+ ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v } }
+ else {
+ while ( p in _tNEXT ) {
+ p=_tNEXT[p] }
+ if ( v in _tNEXT ) {
+ if ( v in _tPARENT ) {
+ --_tQCHLD[a=_tPARENT[v]]; delete _tPARENT[v]
+ if ( v in _tPREV ) {
+ _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v] }
+ else {
+ delete _tPREV[_tFCHLD[a]=_tNEXT[v]] } }
+ else {
+ if ( v in _tPREV ) {
+ _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v] }
+ else {
+ delete _tPREV[_tNEXT[v]] } }
+ delete _tNEXT[v] }
+ else {
+ if ( p==v ) { return v }
+ if ( v in _tPARENT ) {
+ if ( v in _tPREV ) {
+ delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]; --_tQCHLD[a] }
+ else {
+ delete _tFCHLD[a=_tPARENT[v]]; delete _tLCHLD[a]; delete _tQCHLD[a] }
+ delete _tPARENT[v] }
+ else {
+ if ( v in _tPREV ) {
+ delete _tNEXT[_tPREV[v]] } } }
+ return _tNEXT[_tPREV[v]=p]=v } }
+ else {
+ if ( v==0 ) {
+ return v } ######################## p=ptr, v=0
+ return v } } ######################## p=ptr, v=""
+ else {
+ if ( p==0 ) return v ######################## p=0
+ if ( v ) return _texclude(v) ######################## p="", v=ptr - exclude v
+ return v } } ######################## p=""
+#_______________________________________________________________________
+func _rQBRO(p, c,p1) { ################################################
+ if ( p ) {
+ if ( p in _tPARENT ) {
+ return _tQCHLD[_tPARENT[p]] }
+ c=1; p1=p
+ while ( p1 in _tPREV ) {
+ c++; p1=_tPREV[p1] }
+ while ( p in _tNEXT ) {
+ c++; p=_tNEXT[p] }
+ return c }
+ return p }
+#_________________________________________________________________
+func _wQBRO(p,v) { ##############################################
+ return v }
+#_______________________________________________________________________
+func _rLINK(p) { ######################################################
+ return p in _tLINK ? _tLINK[p] : "" }
+#_________________________________________________________________
+func _wLINK(p,v) { ##############################################
+ return _tLINK[p]=v }
+#_____________________________________________________________________________
+func _tpush(p,aA, a) { ######################################################
+ if ( isarray(aA) ) {
+ delete _tSTACK[p][a=++_tSTACK[p][0]]; _tSTACK[p][a][""]; delete _tSTACK[p][a][""]
+ _movarr(_tSTACK[p][a],aA); return }
+ delete _tSTACK[p][a=++_tSTACK[p][0]]; return _tSTACK[p][a]=aA }
+#_________________________________________________________________
+func _tpop(p,aA, a) { ###########################################
+ if ( (a=_tSTACK[p][0])>0 ) {
+ _tSTACK[p][0]--
+ if ( isarray(_tSTACK[p][a]) ) {
+ delete aA; _movarr(aA,_tSTACK[p][a]); return }
+ return _tSTACK[p][a] }
+ _fatal("^" p ": Out of tSTACK") }
+#_________________________________________________________________
+func _tsetsp(p,v) { #############################################
+ return _tSTACK[p][0]=v }
+#_________________________________________________________________
+func _tgetsp(p) { ###############################################
+ return _tSTACK[p][0] }
+#_______________________________________________________________________
+########################################################################
+
+
+func _W(p,A,v) {
+ if ( isarray(v) ) {
+ if ( p ) {
+ delete A[p]; A[p][""]; delete A[p][""]
+ _movarr(A[p],v) }
+ return p }
+ if ( p ) {
+ delete A[p]; return A[p]=v }
+ return v }
+
+
+
+# _tDLINK progressive development: concrete _tDLINK function\processing algo; all frame's families support
+#_____________________________________________________________________________
+func _tframe(fF,p,p0,p1,p2) { ###############################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ p=_isptr(p) ? isarray(fF) ? _tframe_i1(fF,p,p0,p1,p2) : _tframe_i0(fF,p,p0,p1,p2) : ""
+ --_t_ENDF[0]
+ return p }
+#___________________________________________________________
+func _tframe_i0(f,p,p0,p1,p2, a) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tFCHLD ? _tmframe_i0(f,_tFCHLD[p],p0,p1,p2) : (p in _tDLINK ? @f(_tDLINK[p],p0,p1,p2) : @f(p,p0,p1,p2)) }
+#___________________________________________________________
+func _tframe_i1(F,p,p0,p1,p2, a) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tFCHLD ? ("." in F ? _th1(a=F["."],@a(p,p0,p1,p2)) : "") _tmframe_i1(F,_tFCHLD[p],p0,p1,p2) : (">" in F ? _th1(a=F[">"],p in _tDLINK ? @a(_tDLINK[p],p0,p1,p2) : @a(p,p0,p1,p2)) : "") }
+#_________________________________________________________________
+func _tmframe(f,p,p0,p1,p2) { ###################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tmframe_i0(f,p,p0,p1,p2) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tmframe_i0(f,p,p0,p1,p2, t) {
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ t=t _tframe_i0(f,p,p0,p1,p2, p=p in _tNEXT ? _tNEXT[p] : "") }
+ return t }
+#___________________________________________________________
+func _tmframe_i1(F,p,p0,p1,p2, t) {
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ t=t _tframe_i1(F,p,p0,p1,p2, p=p in _tNEXT ? _tNEXT[p] : "") }
+ return t }
+#_________________________________________________________________
+func _trunframe(f,p,p0,p1,p2) { #################################
+ return _tframe(f ? f : "_trunframe_i0",p,p0,p1,p2) }
+#_________________________________________________________________
+func _trunframe_i0(p,p0,p1,p2, f) {
+ if ( p in _tFN ) {
+ f=_tFN[p]
+ return @f(p,p0,p1,p2) } }
+#_____________________________________________________________________________
+func _tbframe(f,p,p0,p1) { ##################################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tbframe_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tbframe_i0(f,p,p0,p1, a) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tLCHLD ? _tmbframe(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmbframe(f,p,p0,p1, t) { ##################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ t=t _tbframe_i0(f,p,p0,p1, p=p in _tPREV ? _tPREV[p] : "") }
+ return t }
+#_________________________________________________________________
+func _tbrunframe(f,p,p0,p1) { ###################################
+ return _tbframe(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func _tframex(f,p,p0,p1) { ############################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tframex_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tframex_i0(f,p,p0,p1) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tFCHLD ? _tmframex(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmframex(f,p,p0,p1, t) { ##################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ t=t _tframex_i0(f,p,p0,p1); p=p in _tNEXT ? _tNEXT[p] : "" }
+ return t }
+#_________________________________________________________________
+func _trunframex(f,p,p0,p1) { ###################################
+ return _tframex(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func _tbframex(f,p,p0,p1) { ###########################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tbframex_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tbframex_i0(f,p,p0,p1) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tLCHLD ? _tmbframex(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmbframex(f,p,p0,p1, t) { #################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ t=t _tbframex_i0(f,p,p0,p1); p=p in _tPREV ? _tPREV[p] : "" }
+ return t }
+#_________________________________________________________________
+func _tbrunframex(f,p,p0,p1) { ##################################
+ return _tbframex(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func _tpass(f,p,p0,p1) { ####################################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tpass_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tpass_i0(f,p,p0,p1, a) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tFCHLD ? _tmpass(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmpass(f,p,p0,p1) { #######################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ p0=_tbpass_i0(f,p,p0,p1, p=p in _tNEXT ? _tNEXT[p] : "") }
+ return p0 }
+#_________________________________________________________________
+func _trunpass(f,p,p0,p1) { #####################################
+ return _tpass(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func _tpassx(f,p,p0,p1) { ###################################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tpassx_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tpassx_i0(f,p,p0,p1) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tFCHLD ? _tmpassx(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmpassx(f,p,p0,p1) { ######################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ p0=_tbpassx_i0(f,p,p0,p1); p=p in _tNEXT ? _tNEXT[p] : "" }
+ return p0 }
+#_________________________________________________________________
+func _trunpassx(f,p,p0,p1) { ####################################
+ return _tpassx(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func _tbpass(f,p,p0,p1) { ###################################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tbpass_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tbpass_i0(f,p,p0,p1, a) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tLCHLD ? _tmbpass(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmbpass(f,p,p0,p1) { ######################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ p0=_tbpass_i0(f,p,p0,p1, p=p in _tPREV ? _tPREV[p] : "") }
+ return p0 }
+#_________________________________________________________________
+func _tbrunpass(f,p,p0,p1) { ####################################
+ return _tbpass(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func _tbpassx(f,p,p0,p1) { ##################################################
+ delete _t_ENDF[++_t_ENDF[0]]
+ f=p ? _tbpassx_i0(f,p,p0,p1) : ""
+ --_t_ENDF[0]
+ return f }
+#___________________________________________________________
+func _tbpassx_i0(f,p,p0,p1) {
+ while ( p in _tLINK ) p=_tLINK[p]
+ return p in _tLCHLD ? _tmbpassx(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func _tmbpassx(f,p,p0,p1) { #####################################
+ while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+ p0=_tbpassx_i0(f,p,p0,p1); p=p in _tPREV ? _tPREV[p] : "" }
+ return p0 }
+#_________________________________________________________________
+func _tbrunpassx(f,p,p0,p1) { ###################################
+ return _tbpassx(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func _tend(a,b) { #####################################################
+ if ( b=="" ) return _t_ENDF[_t_ENDF[0]]=a
+ else return _t_ENDF[_t_ENDF[0]+a]=b }
+#_________________________________________________________________
+func _tifend(l) { ###############################################
+ return (_t_ENDF[0]+l) in _t_ENDF ? (_t_ENDF[_t_ENDF[0]+l] ? _t_ENDF[_t_ENDF[0]+l] : 1) : "" }
+
+
+#_____________________________________________________________________________
+func _tdelete(p, v) { ####################################################### # REMAKE EXCLUDE
+ if ( p ) _wLCHLD(_tDELPTR,p)
+ return v }
+
+
+#_____________________________________________________________________________
+func _tbrochld(p, f,pp) { ################################################### # TEST!!!
+ if ( p ) {
+ if ( p in _tFCHLD ) {
+ f=_tFCHLD[p]; delete _tFCHLD[p]; delete _tLCHLD[p]
+ if ( p in _tPARENT ) {
+ pp=_tPARENT[p]; delete _tPARENT[p]
+ if ( p in _tPREV ) {
+ _tNEXT[_tPREV[f]=_tPREV[p]]=f; delete _tPREV[p] }
+ else {
+ _tFCHLD[pp]=f }
+ for ( ; f in _tNEXT; f=_tNEXT[f] ) _tPARENT[f]=pp
+ _tPARENT[f]=pp
+ if ( p in _tNEXT ) {
+ _tPREV[_tNEXT[f]=_tNEXT[p]]=f; delete _tNEXT[p] }
+ else {
+ _tLCHLD[pp]=f }
+ _tQCHLD[pp]=_tQCHLD[pp]+_tQCHLD[p]-1
+ delete _tQCHLD[p]
+ return f }
+ else {
+ delete _tQCHLD[p]
+ if ( p in _tPREV ) {
+ _tNEXT[_tPREV[f]=_tPREV[p]]=f; delete _tPREV[p] }
+ for ( ; f in _tNEXT; f=_tNEXT[f] ) delete _tPARENT[f]
+ delete _tPARENT[f]
+ if ( p in _tNEXT ) {
+ _tPREV[_tNEXT[f]=_tNEXT[p]]=f; delete _tNEXT[p] }
+ return f } }
+ else {
+ if ( p in _tPARENT ) {
+ pp=_tPARENT[p]; delete _tPARENT[p]
+ if ( p in _tPREV ) {
+ if ( p in _tNEXT ) {
+ _tNEXT[_tPREV[f]=_tPREV[p]]=f=_tNEXT[p]; delete _tNEXT[p] }
+ else {
+ delete _tNEXT[_tLCHLD[pp]=_tPREV[p]] }
+ delete _tPREV[p]; _tQCHLD[pp]-- }
+ else {
+ if ( p in _tNEXT ) {
+ delete _tPREV[_tFCHLD[pp]=_tNEXT[p]]; delete _tNEXT[p]; _tQCHLD[pp]-- }
+ else {
+ delete _tFCHLD[pp]; delete _tLCHLD[pp]; delete _tQCHLD[pp] } } }
+ else {
+ if ( p in _tPREV ) {
+ if ( p in _tNEXT ) {
+ _tNEXT[_tPREV[f]=_tPREV[p]]=f=_tNEXT[p]; delete _tNEXT[p] }
+ else {
+ delete _tNEXT[_tPREV[p]] }
+ delete _tPREV[p] }
+ else {
+ if ( p in _tNEXT ) {
+ delete _tPREV[_tNEXT[p]]; delete _tNEXT[p] } } } } }
+ return p }
+
+# test _tbrochld fn; develope tOBJ r\w func specification for brochld func
+
+#_________________________________________________________________
+func _tinit_i0(D,S, i) {
+ for ( i in S ) {
+ if ( isarray(S[i]) ) {
+ if ( !isarray(D[i][""]) ) {
+ delete D[i]; D[i][""]; delete D[i][""] }
+ _N_i0(D[i],S[i]) }
+ else {
+ if ( isarray(D[i]) ) delete D[i]
+ D[i]=S[i] } } }
+#_______________________________________________________________________
+func W(p,p0,p1) { #####################################################
+ if ( isarray(p0) ) {
+ delete p0[p]
+ if ( isarray(p1) ) {
+ for ( i in p1 ) {
+ if ( isarray(p1[i]) ) {
+ p0[p][i][""]; delete p0[p][i][""]; _N_i0(p0[p][i],p1[i]) }
+ else p0[p][i]=p1[i] }
+ return p }
+ return p0[p]=p1 }
+ delete _[p][p0]
+ if ( isarray(p1) ) {
+ for ( i in p1 ) {
+ if ( isarray(p1[i]) ) {
+ _[p][p0][i][""]; delete _[p][p0][i][""]; _N_i0(_[p][p0][i],p1[i]) }
+ else _[p][p0][i]=p1[i] }
+ return p }
+ return _[p][p0]=p1 }
+
+
+
+
+#___________________________________________________________________________________
+# EMMULATED FUNCTIONAL FIELDS ######################################################
+
+#_____________________________________________________________________________
+func _rSQFIRST(g,p,A) { #####################################################
+ if ( isarray(A) ) return _rSQFIRSTA(g,p,A)
+ _SQTOPTR[g]=p; _SQSTACK[g][0]=0
+ return _rsqgetptr(g,p) }
+#_________________________________________________________________
+func _rSQFIRSTA(g,p,A) { ########################################
+ _SQTOPTR[g]=p; _SQSTACK[g][0]=0
+ if ( (p=_rsqgetptr(g,p)) in A ) return p
+ return _rSQNEXTA(g,p,A) }
+#_______________________________________________________________________
+func _rSQNEXT(g,p,A) { ################################################
+ if ( isarray(A) ) return _rSQNEXTA(g,p,A)
+ return _rsqnext_i0(g,p) }
+#___________________________________________________________
+func _rsqnext_i0(g,p) {
+ if ( p==_SQTOPTR[g] ) {
+ if ( _SQSTACK[g][0]>0 ) {
+ _SQTOPTR[g]=_SQSTACK[g][_SQSTACK[g][0]--]
+ return _rsqnext_i0(g,_SQSTACK[g][_SQSTACK[g][0]--]) }
+ return }
+ if ( p in _tNEXT ) return _rsqgetptr(g,_tNEXT[p])
+ return _rsqnext_i0(g,_tPARENT[p]) }
+#_________________________________________________________________
+func _rSQNEXTA(g,p,A) { #########################################
+ if ( p==_SQTOPTR[g] ) {
+ if ( _SQSTACK[g][0]>0 ) {
+ _SQTOPTR[g]=_SQSTACK[g][_SQSTACK[g][0]--]
+ return _rSQNEXTA(g,_SQSTACK[g][_SQSTACK[g][0]--],A) }
+ return }
+ while ( p in _tNEXT ) {
+ if ( (p=_rsqgetptr(g,_tNEXT[p])) in A ) return p }
+ return p in _tPARENT ? _rSQNEXTA(g,_tPARENT[p],A) : "" }
+#_________________________________________________________________
+func _rsqgetptr(g,p,A) {
+ if ( p in _tLINK ) {
+ _SQSTACK[g][++_SQSTACK[g][0]]=p
+ _SQSTACK[g][++_SQSTACK[g][0]]=_SQTOPTR[g]
+ while ( (p=_tLINK[p]) in _tLINK ) { _con(".") }
+ _SQTOPTR[g]=p }
+ if ( p in _tFCHLD ) return _rsqgetptr(g,_tFCHLD[p])
+ return p }
+#___________________________________________________________________________________
+####################################################################################
+
+
+#___________________________________________________________________________________
+# OTHER tFUNCTIONs #################################################################
+
+#_____________________________________________________________________________
+func _dumpobj(p,f,t, s) { ###################################################
+ s=_dumpobj_i0(p,f,t=t "." p "{")
+ if ( (p=_rFCHLD(p)) ) return s=s _dumpobjm(p,f,s ? _getchrln(" ",length(t)-1) : t " ")
+ return s }
+#___________________________________________________________
+func _dumpobj_i0(p,f,t) {
+ if ( f=="" ) return _dumpobj_i2(p,t)
+ if ( f==0 ) return _dumpobj_i1(p,t " ")
+ return _dumpobj_i1(p,t " ") _dumpobj_i2(p,_getchrln(" ",length(t))) }
+#___________________________________________________________
+func _dumpobj_i1(p,t) {
+ return _ln(t substr(((p in _tPREV) ? "\xAB" _tPREV[p] : "") " ",1,7) " " substr(((p in _tPARENT) ? "\x88" _tPARENT[p] : "") " ",1,7) " " substr( ((p in _tFCHLD) ? _tFCHLD[p] : "") "\x85" ((p in _tQCHLD) ? " (" _tQCHLD[p] ") " : "\x85") "\x85" ((p in _tLCHLD) ? _tLCHLD[p] : "") " ",1,22) substr(((p in _tNEXT) ? "\xBB" _tNEXT[p] : "") " ",1,8) ) }
+#___________________________________________________________
+func _dumpobj_i2(p,t) {
+ return _dumpobj_i3(_[p],t " ") _dumpobj_i3(_ptr[p],_getchrln(" ",length(t)) "`","`") }
+#___________________________________________________________
+func _dumpobj_i3(A,t,p,e, s,i,t2) {
+ if ( isarray(A) ) {
+ for ( i in A ) {
+ t2=_getchrln(" ",length(t))
+ for ( i in A ) { if ( isarray(A[i]) ) s=s _dumpobj_i3(A[i],t "[" _dumpobj_i4(i) "]",p,_ln())
+ else s=s _ln(t "[" _dumpobj_i4(i) "]=" p _dumpobj_i4(A[i]) "'")
+ t=t2 }
+ return s }
+ return e=="" ? "" : t e }
+ if ( A==0 && A=="" ) return
+ return _ln(t "=" _dumpobj_i4(p A) "'") }
+#___________________________________________________________
+func _dumpobj_i4(t) {
+ if ( length(t)>64 ) return substr(t,1,28) " ... " substr(t,length(t)-28)
+ return t }
+#_________________________________________________________________
+func _dumpobjm(p,f,t, s,t2) { ###################################
+ t2=_getchrln(" ",length(t))
+ do { s=s _dumpobj(p,f,t); t=t2 } while ( (p=_rNEXT(p)) )
+ return s }
+#_________________________________________________________________
+func _dumpobj_nc(p,f,t) { #######################################
+ return _dumpobj_i0(p,f,t "." p "{ ") }
+#_________________________________________________________________
+func _dumpobjm_nc(p,f,t, s,t2) { ################################
+ t2=_getchrln(" ",length(t))
+ do { s=s _dumpobj_nc(p,f,t); t=t2 } while ( (p=_rNEXT(p)) )
+ return s }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+func _tapi(p,f,p0,p1,p2,p3, c) {
+ c=p
+ do { if ( f in _[c]["API"] ) { f=_[c]["API"][f]; return @f(p,p0,p1,p2,p3) }
+ c=_[c]["CLASS"] } while ( "CLASS" in _[c] ) }
+
+# if ( F in _TCLASS ) { _[p]["CLASS"]=_TCLASS[F]; _tapi(p); return p }
+# # ??? _mpu(F,p) ???
+# return p }
+# _[p][F]=v; return p }
+
+#_______________________________________________________________________
+func _tgetitem(p,n, a,b) { ############################################
+ if ( p ) {
+ if ( isarray(_PTR[p]["ITEM"]) && (n in _PTR[p]["ITEM"]) ) a=_PTR[p]["ITEM"][n]
+ else a=_PTR[p]["ITEM"][n]=_N()
+ if ( !(b=_rFCHLD(a)) ) { b=_wLCHLD(a,_N()); _PTR[b]["HOST"]=p; _[b]["ITEMNAME"]=n }
+ return b } }
+#_________________________________________________________________
+func _tdelitem(p) { #############################################
+ if ( p ) {
+ if ( "HOST" in _PTR[p] && "ITEMNAME" in _[p] ) {
+ return _wLCHLD(_PTR[_PTR[p]["HOST"]]["ITEM"][_[p]["ITEMNAME"]],p) }
+ _tdelete(p); return p } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_____________________________________________________________________________
+func _tframe0(f,p,p0,p1,p2,p3, A) { #########################################
+ if ( _isptr(p) ) { if ( isarray(f) ) return _tframe0_i0(f,p)
+ _tframex_p0(A,f,0); return _th0(_tframe0_i0(A,p),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func _tframe0_i0(A,p, f) { if ( p in _tLINK ) {
+ _tframe_link=p
+ if ( "`" in A ) { f=A["`"]; while ( p in _tLINK ) @f(p=_tLINK[p]) }
+ else while ( p in _tLINK ) p=_tLINK[p] }
+ else _tframe_link=""
+ if ( p in _tFCHLD ) return _tframe0_i2(A,"^",p) _tframe0_i1(A,_tFCHLD[p])
+ return _tframe0_i2(A,".",p) }
+#_______________________________________________
+func _tframe0_i1(A,p) { if ( _TEND[_ARRLEN] in _TEND ) return
+ if ( p in _tNEXT ) return _tframe0_i0(A,p) _tframe0_i1(A,_tNEXT[p])
+ return _tframe0_i0(A,p) }
+#_______________________________________________
+func _tframe0_i2(A,m,p) { _tframe_dlink=p; while ( p in _tDLINK ) p=_tDLINK[p]
+ if ( m in A ) { if ( (m "~") in A ) { if ( !(_TYPEWORD in _[p]) || A[m "~"]!~_[p][_TYPEWORD] ) return }
+ m=A[m]; return @m(p) } }
+#_____________________________________________________
+func _tframex_p0(A,f,q, i,B,C) {
+ _tframe_qparam=q; delete _TEND[++_TEND[_ARRLEN]]
+
+ if ( match(f,/\~(.*)$/,B) ) { A["^~"]=A[".~"]=B[1]; f=substr(f,1,RSTART-1) }
+ A["."]=A["^"]=f; return
+ q=split(f,B,/;/); i=0
+ while ( i<q ) { _tframex_p1(A,C[i]); while ( ++i<=q ) _tframex_p1(A,C[i],B[i]) } }
+#_______________________________________________
+func _tframex_p1(A,v,i, r,B) {
+ gsub(/[ \t]+/,"",v)
+ while ( match(v,/^([^~]*)~\/(([^\/\\]*\\.)*[^\/\\]*)\//,B) ) { v=B[1] substr(v,RSTART+RLENGTH); r=B[2] }
+ if ( i=="" ) { if ( v!="" ) { A["."]=v; delete A["`"]; delete A["^"] }
+ if ( r!="" ) A[".~"]=A["`~"]=A["^~"]=r }
+ else { if ( match(v,/!/) ) delete A[i]
+ else { A[i]=v; if ( r!="" ) A[i "~"]=r } } }
+#_________________________________________________________________
+func _tframe1(f,p,p0,p1,p2,p3, A) { #############################
+ if ( _isptr(p) ) { if ( isarray(f) ) return _tframe1_i0(f,p,p0)
+ _tframex_p0(A,f,1); return _th0(_tframe1_i0(A,p,p0),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func _tframe1_i0(A,p,p0) { _tframe_link=p; while ( p in _tLINK ) p=_tLINK[p]
+ if ( p in _tFCHLD ) return _tframe1_i2(A,"^",p,p0) _tframe1_i1(A,_tFCHLD[p],p0)
+ return _tframe1_i2(A,".",p,p0) }
+#_______________________________________________
+func _tframe1_i1(A,p,p0) { if ( _TEND[_ARRLEN] in _TEND ) return
+ if ( p in _tNEXT ) return _tframe1_i0(A,p,p0) _tframe1_i1(A,_tNEXT[p],p0)
+ return _tframe1_i0(A,p,p0) }
+#_______________________________________________
+func _tframe1_i2(A,m,p,p0) { _tframe_dlink=p; while ( p in _tDLINK ) p=_tDLINK[p]
+ if ( m in A ) { if ( (m "~") in A ) { if ( !(_TYPEWORD in _[p]) || A[m "~"]!~_[p][_TYPEWORD] ) return }
+ m=A[m]; return @m(p,p0) } }
+#_________________________________________________________________
+func _tframe2(f,p,p0,p1,p2,p3, A) { #############################
+ if ( _isptr(p) ) { if ( isarray(f) ) return _tframe2_i0(f,p,p0,p1)
+ _tframex_p0(A,f,2); return _th0(_tframe2_i0(A,p,p0,p1),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func _tframe2_i0(A,p,p0,p1) { _tframe_link=p; while ( p in _tLINK ) p=_tLINK[p]
+ if ( p in _tFCHLD ) return _tframe2_i2(A,"^",p,p0,p1) _tframe2_i1(A,_tFCHLD[p],p0,p1)
+ return _tframe2_i2(A,".",p,p0,p1) }
+#_______________________________________________
+func _tframe2_i1(A,p,p0,p1) { if ( _TEND[_ARRLEN] in _TEND ) return
+ if ( p in _tNEXT ) return _tframe2_i0(A,p,p0,p1) _tframe2_i1(A,_tNEXT[p],p0,p1)
+ return _tframe2_i0(A,p,p0,p1) }
+#_______________________________________________
+func _tframe2_i2(A,m,p,p0,p1) { _tframe_dlink=p; while ( p in _tDLINK ) p=_tDLINK[p]
+ if ( m in A ) { if ( (m "~") in A ) { if ( !(_TYPEWORD in _[p]) || A[m "~"]!~_[p][_TYPEWORD] ) return }
+ m=A[m]; return @m(p,p0,p1) } }
+#_________________________________________________________________
+func _tframe3(f,p,p0,p1,p2,p3, A) { #############################
+ if ( _isptr(p) ) { if ( isarray(f) ) return _tframe3_i0(f,p,p0,p1,p2)
+ _tframex_p0(A,f,3); return _th0(_tframe3_i0(A,p,p0,p1,p2),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func _tframe3_i0(A,p,p0,p1,p2) { _tframe_link=p; while ( p in _tLINK ) p=_tLINK[p]
+ if ( p in _tFCHLD ) return _tframe3_i2(A,"^",p,p0,p1,p2) _tframe3_i1(A,_tFCHLD[p],p0,p1,p2)
+ return _tframe3_i2(A,".",p,p0,p1,p2) }
+#_______________________________________________
+func _tframe3_i1(A,p,p0,p1,p2) { if ( _TEND[_ARRLEN] in _TEND ) return
+ if ( p in _tNEXT ) return _tframe3_i0(A,p,p0,p1,p2) _tframe3_i1(A,_tNEXT[p],p0,p1,p2)
+ return _tframe3_i0(A,p,p0,p1,p2) }
+#_______________________________________________
+func _tframe3_i2(A,m,p,p0,p1,p2) { _tframe_dlink=p; while ( p in _tDLINK ) p=_tDLINK[p]
+ if ( m in A ) { if ( (m "~") in A ) { if ( !(_TYPEWORD in _[p]) || A[m "~"]!~_[p][_TYPEWORD] ) return }
+ m=A[m]; return @m(p,p0,p1,p2) } }
+#_________________________________________________________________
+func _tframe4(f,p,p0,p1,p2,p3, A) { #############################
+ if ( _isptr(p) ) { if ( isarray(f) ) return _tframe4_i0(f,p,p0,p1,p2,p3)
+ _tframex_p0(A,f,4); return _th0(_tframe4_i0(A,p,p0,p1,p2,p3),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func _tframe4_i0(A,p,p0,p1,p2,p3) { _tframe_link=p; while ( p in _tLINK ) p=_tLINK[p]
+ if ( p in _tFCHLD ) return _tframe4_i2(A,"^",p,p0,p1,p2,p3) _tframe4_i1(A,_tFCHLD[p],p0,p1,p2,p3)
+ return _tframe4_i2(A,".",p,p0,p1,p2,p3) }
+#_______________________________________________
+func _tframe4_i1(A,p,p0,p1,p2,p3) { if ( _TEND[_ARRLEN] in _TEND ) return
+ if ( p in _tNEXT ) return _tframe4_i0(A,p,p0,p1,p2,p3) _tframe4_i1(A,_tNEXT[p],p0,p1,p2,p3)
+ return _tframe4_i0(A,p,p0,p1,p2,p3) }
+#_______________________________________________
+func _tframe4_i2(A,m,p,p0,p1,p2,p3) { _tframe_dlink=p; while ( p in _tDLINK ) p=_tDLINK[p]
+ if ( m in A ) { if ( (m "~") in A ) { if ( !(_TYPEWORD in _[p]) || A[m "~"]!~_[p][_TYPEWORD] ) return }
+ m=A[m]; return @m(p,p0,p1,p2,p3) } }
+#_____________________________________________________
+# _tframe0(hndstr,ptr)
+#
+#
+# IN:
+# MOD:
+# OUT:
+# RETURN:
+#
+# handler string:
+# Handler-string divides to words. Word splitter is char ";"
+#
+# Note that handler-string processed left to right. This mean that next word(more rightly) will overwrite fields implemented before(leftmost).
+# Note that if word-string contains more than one rexp-field then only last rexp-field(most rightly) will be applied.
+#_______________________________________________
+# TO DESIGN:
+#
+# 0-4: complete design of tlink handler call
+# 1-4: add new tlink handler call
+# 1-4: add new run fn (changed rexp to different for each type: see _tframe0)
+#
+# hndstr:
+# may be add rexp for each type of handler and also total rexp for all ??? ADDED (test)
+# may be add separator char ";" ??? ADDED (test)
+#_______________________________________________________________________
+func _tzend(a,b) { #####################################################
+ if ( b==0 && b=="" ) return _TEND[_TEND[_ARRLEN]]=a
+ else return _TEND[_TEND[_ARRLEN]+a]=b }
+#_______________________________________________
+BEGIN { _TEND[_ARRLEN]=0
+ _TYPEWORD ="_TYPE" }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+# _N(arr\str\mpuptr,val) \ _n(arr\str\mpuptr,val)
+# This functions create new object and return ptr.
+# _n() - creates object from list of deleted objects or if it's empty create new one, while _N() always create new one
+# It is strongly recommended to use _N() for the objects that have some data outside of standart object arrays. Or - make routines
+# that will clear outsided object data in case if object deleting.
+#
+# IN: arr\str\mpu,val - (both missed) just create obj and return ptr
+# arr,val - create object and write arr[ptr]=val
+# str,val - create object and write _[ptr][str]=val
+# mpuptr - NOT ALLOWED (val missed) create object and run MPU-code specified by mpuptr with created object ptr as primary parameter
+# MOD: -
+# OUT: -
+# RETURN: ptr - pointer to newly created object
+#_________________________________________________________________
+# _tdel(ptr)
+# This function exclude object from it's current structure and delete it. ptr can be later used by function: _n() for creating new object
+# Also same story will occured with all chields and subchields of object specified by ptr.
+# ??? What happened with linked py _ptr[ptr] objects ???
+#
+# IN: ptr - pointer to object that will deleted
+# MOD: -
+# OUT: -
+# RETURN: undefined
+#_________________________________________________________________
+# _isptr(ptr)
+# This function checks: is ptr is the object pointer that is currently exist?
+# Unescaped remained data will be in data of src_dst_ptr.
+#
+# IN: ptr - string that will be tested
+# MOD: -
+# OUT: -
+# RETURN: undefined - if ptr is not pointer to exist object
+# ptr - if ptr is the pointer to exist object
+#_________________________________________________________________
+
+
+
+#_________________________________________________________________
+#
+# TO DESIGN:
+#
+# create basic objectapi interface support
+# modify everywhere checking ptr not by `if ( ptr )...', but by `if ( ptr in _ )...'
+# _TMP0, _TMP1 name change to something like _DATA name ???
+# think about redesigning routines for not depending if ptr is exist in tsysarrs: reason: performance\light code
+
+
+
+
+
+
+
+
+
+
+
+func _tlist(L,p,f) {
+ _tlisti1=_tlisti0=L[_ARRLEN]+0
+ if ( f==0 && f=="" ) _tlist_i0(L,p)
+ else { _tlistf0=f in _TAPI ? _TAPI[f] : f; _tlist_i1(L,p) }
+ return _tlisti0-_tlisti1 }
+
+func _tlist_i0(L,p, q,i) { if ( isarray(p) ) { q=p[_ARRLEN]; i=0; while ( i++<q ) _tlist_i0(L,p[i]); return }
+ if ( p in _ ) { while ( p in _tLINK ) p=_tLINK[p]
+ L[++_tlisti0]=p
+ if ( p in _tFCHLD ) for ( p=_tFCHLD[p]; p; p=p in _tNEXT ? _tNEXT[p] : "" ) _tlist_i0(L,p) } }
+
+func _tlist_i1(L,p) { if ( isarray(p) ) { q=p[_ARRLEN]; i=0; while ( i++<q ) _tlist_i1(L,p[i]); return }
+ if ( p in _ ) { while ( p in _tLINK ) p=_tLINK[p]
+ if ( _tlistf0 in _[p] ) L[++_tlisti0]=p
+ if ( p in _tFCHLD ) for ( p=_tFCHLD[p]; p; p=p in _tNEXT ? _tNEXT[p] : "" ) _tlist_i1(L,p) } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+##########################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# _rFBRO(ptr) - Return ptr of first-bro. [TESTED]
+# If !ptr then returns "".
+#_____________________________________________________________________________
+# _rLBRO(ptr) - Return ptr of last-bro. [TESTED]
+# If !ptr then returns "".
+#_____________________________________________________________________________
+# _rQBRO(ptr) - Returns brothers total quantity. [TESTED]
+# If !ptr then returns "".
+END{ ###############################################################################
+
+ if ( _gawk_scriptlevel<1 ) {
+ if ( !_fileio_notdeltmpflag ) {
+ _FILEIO_TMPATHS[_FILEIO_TMPRD]
+ _Foreach(_FILEIO_TMPATHS,"_uninit_del") } } }
+#_____________________________________________________________________________
+func _uninit_del(A,i,p0) {
+ _del(i) }
+#___________________________________________________________________________________
+####################################################################################
+
+#___________________________________________________________________________________
+func _out(t, a,b) { ###############################################################
+ a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+ print t > _SYS_STDOUT; fflush(_SYS_STDOUT)
+ BINMODE=a; ORS=b
+ return t }
+#_________________________________________________________________
+func _outnl(t) { ################################################
+ return _out(t (t~/\x0A$/ ? "" : _CHR["EOL"])) }
+#_______________________________________________________________________
+func _err(t, a,b) { ###################################################
+ a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+ print t > _SYS_STDERR; fflush(_SYS_STDERR)
+ BINMODE=a; ORS=b
+ return t }
+#_________________________________________________________________
+func _errnl(t) { ################################################
+ return _err(t (t~/\x0A$/ ? "" : _CHR["EOL"])) }
+#_____________________________________________________________________________
+func _getfilepath(t, f,al,b,A) { ############################################
+ ERRNO=""
+ if ( match(t,/^[ \t]*(("([^"]*)"[ \t]*)|([`']([^']*)'[ \t]*)|(([^ \t]+)[ \t]*))/,A) ) {
+ al=RLENGTH; f=A[3] A[5] A[7]; _conl("_getfilepath(" f ") (" al ")")
+ if ( (b=_filepath(f)) ) { if ( length(f)<=FLENGTH ) { FLENGTH=al; return b }
+ ERRNO="Filepath `" f "' error" } }
+ FLENGTH=0 }
+#_______________________________________________________________________
+func _filepath(f,dd) { ################################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return filegetrootdir(f,dd) (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : "") }
+#_________________________________________________________________
+func _filerdne(f,dd) { ##########################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ if ( (f in _FILENAM) ) return filegetrootdir(f,dd) _FILENAM[f] (f in _FILEXT ? _FILEXT[f] : "")
+ if ( f in _FILEXT ) return filegetrootdir(f,dd) _FILEXT[f]
+ return "" }
+#_________________________________________________________________
+func _filerdn(f,dd) { ###########################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return f in _FILENAM ? (filegetrootdir(f,dd) _FILENAM[f]) : "" }
+#_________________________________________________________________
+func _filerd(f,dd) { ############################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return filegetrootdir(f,dd) }
+#_________________________________________________________________
+func _filer(f,dd) { #############################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ if ( f in _FILEROOT ) return _FILEROOT[f]
+ if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT ) return _FILEROOT[dd,f]
+ return _FILEROOT[dd,f]=fileri(dd) }
+#_________________________________________________________________
+func _filed(f,dd, d) { ##########################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ if ( f in _FILEDIRFL ) return _FILEDIR[f]
+ if ( f in _FILEROOT ) {
+ if ( (d=filegetdrvdir(_FILEROOT[f])) ) _FILEDIRFL[f]
+ return _FILEDIR[f]=d _FILEDIR[f] }
+ if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEDIR ) return _FILEDIR[dd,f]
+ if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ ) return _FILEDIR[dd,f]=d
+ return d }
+#___________________________________________________________
+func filegetrootdir(f,dd, d) {
+ if ( f in _FILEDIRFL ) {
+ if ( f in _FILEROOT ) return _FILEROOT[f] _FILEDIR[f]
+ if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT ) return _FILEROOT[dd,f] _FILEDIR[f]
+ return (_FILEROOT[dd,f]=fileri(dd)) _FILEDIR[f] }
+ if ( f in _FILEROOT ) {
+ if ( (d=filegetdrvdir(_FILEROOT[f])) ) {
+ _FILEDIRFL[f]; return _FILEROOT[f] (_FILEDIR[f]=d _FILEDIR[f]) }
+ else return _FILEROOT[f] _FILEDIR[f] }
+ if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT ) {
+ if ( (dd,f) in _FILEDIR ) return _FILEROOT[dd,f] _FILEDIR[dd,f]
+ if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ ) return _FILEROOT[dd,f] (_FILEDIR[dd,f]=d)
+ return _FILEROOT[dd,f] d }
+ if ( (dd,f) in _FILEDIR ) return (_FILEROOT[dd,f]=fileri(dd)) _FILEDIR[dd,f]
+ if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ ) return (_FILEROOT[dd,f]=fileri(dd)) (_FILEDIR[dd,f]=d)
+ return (_FILEROOT[dd,f]=fileri(dd)) d }
+#___________________________________________________________
+func _filerdnehnd(st, c,r,d,n,A) {
+ if ( st ) {
+ if ( (c=toupper(st)) in _FILECACHE ) {
+ FLENGTH=length(st); return _FILECACHE[c] }
+ if ( match(st,/^[ \t]*\\[ \t]*\\/) ) {
+ if ( match(substr(st,(FLENGTH=RLENGTH)+1),/^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A) ) {
+ FLENGTH=FLENGTH+RLENGTH
+ d=(A[3] ? ("\\" A[3] "$") : "") A[4]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+ if ( (st=toupper((r="\\\\" A[1]) d (n=A[8]))) in _FILECACHE ) return _FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]
+ _FILEDIR[c=_FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d; _FILEDIRFL[c]
+ _FILEROOT[c]=r }
+ else {
+ FLENGTH=0; _filepath_err="UNC"; return "" } }
+ else {
+ match(st,/^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A)
+ if ( !(FLENGTH=RLENGTH) ) return ""
+ d=A[8] A[10]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+ if ( (st=toupper((r=A[5] A[6]) d (n=A[14]))) in _FILECACHE ) return _FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]
+ _FILEDIR[c=_FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d
+ if ( A[8] ) _FILEDIRFL[c]
+ if ( r ) _FILEROOT[c]=r }
+ if ( n ) {
+ if ( match(n,/\.[^\.]*$/) ) {
+ _FILEXT[c]=substr(n,RSTART); _FILENAM[c]=substr(n,1,RSTART-1) }
+ else _FILENAM[c]=n }
+ return c }
+ return "" }
+#___________________________________________________________
+func filedi(f, d) {
+ if ( (f=filerdnehndi(f))=="" ) return _FILEIO_D
+ if ( f in _FILEDIRFL ) return _FILEDIR[f]
+ if ( f in _FILEROOT ) {
+ if ( (d=filegetdrvdir(_FILEROOT[f])) ) _FILEDIRFL[f]
+ return _FILEDIR[f]=d _FILEDIR[f] }
+ if ( (_FILEIO_RD,f) in _FILEDIR ) return _FILEDIR[_FILEIO_RD,f]
+ return _FILEDIR[_FILEIO_RD,f]=_FILEIO_D _FILEDIR[f] }
+#_____________________________________________________
+func fileri(f) {
+ if ( (f=filerdnehndi(f))=="" ) return _FILEIO_R
+ if ( f in _FILEROOT ) return _FILEROOT[f]
+ if ( (_FILEIO_RD,f) in _FILEROOT ) return _FILEROOT[_FILEIO_RD,f]
+ return _FILEROOT[_FILEIO_RD,f]=_FILEIO_R }
+#___________________________________________________________
+func filerdnehndi(st, a,c,r,d,n,A) {
+ if ( st ) {
+ if ( (c=toupper(st)) in _FILECACHE ) return _FILECACHE[c]
+ if ( match(st,/^[ \t]*\\[ \t]*\\/) ) {
+ if ( match(substr(st,a=RLENGTH+1),/^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)*[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A) ) {
+ a=a+RLENGTH
+ d=(A[3] ? ("\\" A[3] "$") : "") "\\" A[5]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+ if ( (st=toupper((r="\\\\" A[1]) d (n=A[8]))) in _FILECACHE ) return _FILECACHE[substr(c,1,a)]=_FILECACHE[st]
+ _FILEDIR[c=_FILECACHE[substr(c,1,a)]=_FILECACHE[st]=++_file_rootcntr]=d; _FILEDIRFL[c]
+ _FILEROOT[c]=r }
+ else {
+ _filepath_err="UNC"; return "" } }
+ else {
+ match(st,/^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A)
+ if ( !RLENGTH ) return ""
+ d=A[8] A[10]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+ if ( (st=toupper((r=A[5] A[6]) d (n=A[14]))) in _FILECACHE ) return _FILECACHE[substr(c,1,RLENGTH)]=_FILECACHE[st]
+ _FILEDIR[c=_FILECACHE[substr(c,1,RLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d
+ if ( A[8] ) _FILEDIRFL[c]
+ if ( r ) _FILEROOT[c]=r }
+ if ( n ) {
+ if ( match(n,/\.[^\.]*$/) ) {
+ _FILEXT[c]=substr(n,RSTART); _FILENAM[c]=substr(n,1,RSTART-1) }
+ else _FILENAM[c]=n }
+ return c }
+ return "" }
+#___________________________________________________________
+func filegetdrvdir(t, r) {
+ if ( t in _FILEDRV ) return _FILEDRV[t]
+ if ( match(r=_cmd("cd " t " 2>NUL"),/[^\x00-\x1F]+/) ) {
+ r=gensub(/[ \t]*([\\\$\:])[ \t]*/,"\\1","G",substr(r,RSTART,RLENGTH)); gsub(/(^[ \t]*)|([ \t]*$)/,"",r)
+ if ( match (r,/\:(.*)/) ) {
+ return _FILEDRV[tolower(t)]=_FILEDRV[toupper(t)]=substr(r,RSTART+1) (r~/\\$/ ? "" : "\\") } }
+ return "" }
+#_________________________________________________________________
+func _filene(f) { ###############################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : "") }
+#_________________________________________________________________
+func _filen(f) { ################################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return f in _FILENAM ? _FILENAM[f] : "" }
+#_________________________________________________________________
+func _file(f) { #################################################
+ if ( (f=_filerdnehnd(f))=="" ) return ""
+ return f in _FILEXT ? _FILEXT[f] : "" }
+
+
+
+#_______________________________________________________________________
+func _rdfile(f, i,A) { ################################################
+ if ( ((f=_filerdne(f))=="") || (_filene(f)=="") ) { ERRNO="Filename error"; return }
+ _fio_cmda=RS; RS=".{1,}"; _fio_cmdb=BINMODE; BINMODE="rw"; ERRNO=RT=_NUL
+ getline RS < f; BINMODE=_fio_cmdb; RS=_fio_cmda
+ if ( ERRNO=="" ) close(f)
+ if ( ERRNO=="" ) return RT
+ return RT=_NOP }
+#_________________________________________________________________
+func _wrfile(f,d, a,b) { #########################################
+ if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+ ERRNO="Filename error"; return }
+ a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+ print d > f
+ if ( ERRNO ) return ""
+ close(f)
+ BINMODE=a; ORS=b
+ if ( ERRNO ) return ""
+ return f }
+#___________________________________________________________
+func _wrfile1(f,d, a,b) { ##################################
+ if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+ ERRNO="Filename error"; return }
+ a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+ print d > f
+ if ( ERRNO ) return ""
+ close(f)
+ BINMODE=a; ORS=b
+ if ( ERRNO ) return ""
+ return d }
+#___________________________________________________________
+func _addfile(f,d, a,b) { ##################################
+ if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+ ERRNO="Filename error"; return }
+ a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+ print d >> f
+ if ( ERRNO ) return ""
+ close(f)
+ BINMODE=a; ORS=b
+ if ( ERRNO ) return ""
+ return d }
+#___________________________________________________________
+func _wfilerdnehnd(f, t) {
+ if ( (f=_filerdne(f))=="" ) return ""
+ if ( !((t=_filerd(f)) in _WFILEROOTDIR) ) {
+ _cmd("md \"" t "\" 2>NUL"); _WFILEROOTDIR[t] }
+ return f }
+#_______________________________________________________________________
+func _dir(A,rd, i,r,f,ds,pf,B,C) { ####################################
+ delete A
+ gsub(/(^[ \t]*)|([ \t]*$)/,"",rd); if ( rd=="" ) return ""
+ i=split(_cmd("dir \"" rd "\" 2>NUL"),B,/\x0D?\x0A/)-3
+ pf=(match(B[4],/Directory of ([^\x00-\x1F]+)/,C) ? (C[1] (C[1]~/\\$/ ? "" :"\\")) : "")
+ for ( r=0; i>5; i-- ) {
+ if ( match(B[i],/^([^ \t]*)[ \t]+([^ \t]*)[ \t]+((<DIR>)|([0-9\,]+))[ \t]+([^\x00-\x1F]+)$/,C) ) {
+ if ( C[6]!~/^\.\.?$/ ) {
+ if ( C[4] ) ds="D "
+ else {
+ ds=C[5] " "; gsub(/\,/,"",ds) }
+ if ( (f=_filepath(pf C[6] (C[4] ? "\\" : "")))!="" ) {
+ A[f]=ds C[1] " " C[2]; r++ } } } }
+ return r }
+#_________________________________________________________________
+func _dirtree(A,f, B) { #########################################
+ gsub(/(^[ \t]*)|([ \t]*$)/,"",f)
+ delete A; A[""]; delete A[""]
+ _dirtree_i0(B,8,split(_cmd("dir \"" f "\" /-C /S 2>NUL"),B,/\x0D?\x0A/),A,f=_filerd(f))
+ return f }
+#___________________________________________________________
+func _dirtree_i0(B,i,c,A,f, lf,a,C) {
+ delete A[f]; A[f][0]; delete A[f][0]
+ lf=length(f)
+ for ( ; i<=c; ) {
+ if ( match(B[i],/^[ \t]*Directory of (.+)/,C) ) {
+ if ( substr(a=_filerd(C[1] "\\"),1,lf)==f ) {
+ i=_dirtree_i0(B,i+4,c,A[f],a) }
+ else return i }
+ else if ( match(B[i++],/^([^ \t\-]+)\-([^ \t\-]+)\-([^ \t]+)[ \t]+([^ \t]+)[ \t]+([0-9]+)[ \t]+(.+)$/,C) ) {
+ A[f][f C[6]]=C[5] " " C[1] "/" _CHR["MONTH"][C[2]] "/" C[3] " " C[4] } }
+ return i }
+#_______________________________________________________________________
+func _filexist(f, a) { ################################################
+ if ( f=="" ) return ""
+ if ( (a=_filepath(f))=="" ) {
+ ERRNO="Filepath error `" f "'"; return "" }
+ _cmd("if exist \"" a "\" exit 1 2>NUL")
+ if ( _exitcode==1 ) return a
+ ERRNO="File not found `" f "'"
+ return _NOP }
+#_________________________________________________________________
+func _filenotexist(f, a) { ######################################
+ if ( f=="" ) return ""
+ if ( (a=_filepath(f))=="" ) {
+ ERRNO="Filepath error `" f "'"; return "" }
+ _cmd("if exist \"" a "\" exit 1 2>NUL")
+ if ( _exitcode==1 ) return ERRNO=_NOP
+ return a }
+#_______________________________________________________________________
+func _newdir(f) { #####################################################
+ if ( (f=_filerd(f))=="" ) return
+ if ( !(f in _WFILEROOTDIR) ) {
+ _cmd("md " f " 2>NUL"); _WFILEROOTDIR[f] }
+ return f }
+#_________________________________________________________________
+func _newclrdir(f) { ############################################
+ if ( (f=_filerd(f))=="" ) return
+ _cmd("rd " f " /S /Q 2>NUL"); _cmd("md " f " 2>NUL")
+ _WFILEROOTDIR[f]
+ return f }
+#_______________________________________________________________________
+func _del(f, c,a,A) { #################################################
+ if ( match(f,/\\[ \t]*$/) ) {
+ if ( (c=toupper(_filerd(f))) && (length(f)==FLENGTH) ) {
+ _cmd("rd " c " /S /Q 2>NUL")
+ _deletepfx(_WFILEROOTDIR,c); _deletepfx(_FILEIO_RDTMP,c); _deletepfx(_FILEIO_RDNETMP,c) }
+ else {
+ _conl("HUJ TEBE!")
+ return "" } }
+ else {
+ a=_dir(A,f); _cmd("del " f " /Q 2>NUL")
+ for ( c in A ) {
+ if ( c~/\\$/ ) {
+ _cmd("rd " c " /S /Q 2>NUL")
+ _deletepfx(_WFILEROOTDIR,c); _deletepfx(_FILEIO_RDTMP,c) }
+ _deletepfx(_FILEIO_RDNETMP,c) } }
+ return a }
+#_______________________________________________________________________
+func _setmpath(p, a) { ################################################
+ ERRNO=""
+ if ( (p) && (a=_filerd(p)) ) {
+ if ( _FILEIO_TMPRD ) _FILEIO_TMPATHS[_FILEIO_TMPRD]
+ #if ( _filexist(a) ) _del(a)
+ #_cmd("rd " a " /S /Q 2>NUL"); _cmd("del " a " /Q 2>NUL")
+ return _FILEIO_TMPRD=a }
+ else return _warning("`" p "': cannot set temporary folder" (ERRNO ? (": " ERRNO) : "")) }
+#_________________________________________________________________
+func _getmpfile(f,dd) { #########################################
+ if ( (!dd) || (!(dd=_filerd(dd))) ) dd=_FILEIO_TMPRD
+ if ( (f=_filerdne(_filene(f) ? f : (f "_" ++_FILEIO_TMPCNTR),dd)) ) _FILEIO_RDNETMP[toupper(f)]
+ return f }
+#_________________________________________________________________
+func _getmpdir(f,dd) { ##########################################
+ if ( (!dd) || (!(dd=_filerd(dd))) ) dd=_FILEIO_TMPRD
+ if ( (f=f ? _filerd(f,dd) : _filerd("_" ++_FILEIO_TMPCNTR "\\",dd)) ) _FILEIO_RDTMP[toupper(f)]
+ return f }
+#_________________________________________________________________
+func _untmp(f, a) { #############################################
+ if ( (f=filepath(f)) ) {
+ if ( match(f,/\\$/) ) {
+ _deletepfx(_FILEIO_RDTMP,a=toupper(f)); _deletepfx(_FILEIO_RDNETMP,a) }
+ else {
+ delete _FILEIO_RDNETMP[toupper(f)] }
+ return f }
+ return "" }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+# fn _dirtree(array,pathmask)
+#
+# Return in `array' file tree from pathmask:
+# array["file.filerdne"]="size date time"
+# array["subdir.filerd"]["file.filerdne"]="size date time"
+# array["subdir.filerd"]["file.filerd"][...]
+#
+# The array will be cleared before any action. Function return pathmask w/o ltabspc and rtabspc.
+#___________________________________________________________________________________
+
+
+
+
+
+# OK: change internal function's names to: w\o "_"
+# OK: FLENGTH: should cover r-spcs
+# OK: optimize REXP
+# OK: add new symbols to dir/file names ( ! and + )
+# OK: create _getfilepath()
+# OK: del - conflict with WROOTDIR (do not update it)
+# OK: dir/del - support for filemask ( * and ? )
+# OK: how to define code injections: header\ender; and HANDLERS
+# OK: units in header\ender? conline division...
+# OK: _FILEPATH problem: it will not been defined at the moment when subscript0 starts - at the start TMPRD="_tmp"
+# OK: del: if del("dir\\") - then all ok except it NOT deleted "dir\\" - _del function removed(renamed to __del)
+# OK: tmpdirs: it delete only autotmp dir and only from script0
+# OK: MICROTEST: global testing of filepath (UNC! CORRECT RESULTS! )
+# question about cache: did new just now generated absolute filepath cached in FILECACHE? its seems like NO
+# check _untmp: CONFLICT: if file or dir from autotmp dir will be untmp then it anyway will be deleted; but file or dir from other point never be deleted anyway - so what is the point of untmp?????
+#ERRLOG: _setmpath: warning!!!!!
+
+#___________________________________________________________________________________
+####################################################################################
+# PUBLIC:
+#___________________________________________________________________________________
+#
+# fn _rdfile(_filepath)
+#
+# Read and return data from file specified in _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function read and return data from file. No any changes in data occured.
+# Function use _filerdne function internally. If some syntax error
+# found in _filepath then function return "".
+# If some error occured while reading data from file then fuction return ""
+# and error-text is in ERRNO(and no close-file action will be occured!).
+# If reading data completed successfully then function try to close
+# file and if while closing file some error occured then function
+# returns "" and error-text is in ERRNO.
+# Otherwise function returns readed data.
+#_____________________________________________________________________________
+#
+# fn _wrfile(_filepath,_data)
+#
+# Write data into file specified in _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function write _data to file. No any changes in data occured.
+# Function use _filerdne function internally. If some syntax error
+# found in _filepath then function return "".
+# If some error occured while writing data to file then fuction return ""
+# and error-text is in ERRNO(and no close-file action will be occured!).
+# If writing data completed successfully then function try to close
+# file and if while closing file some error occured then function
+# returns "" and error-text is in ERRNO.
+# Otherwise function returns _filepath(re-processed).
+#___________________________________________________________________________________
+#
+# fn _filepath(_filepath)
+#
+# Return re-processed root-dir-name-ext of _filepath.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filerdne(_filepath)
+#
+# Return re-processed root-dir-filename of _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function return result only if in _filepath present file-name(name
+# and/or extension) - otherwise its return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filerdn(_filepath)
+#
+# Return re-processed root-dir-name of _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function return result only if in _filepath present name field -
+# - otherwise its return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filerd(_filepath)
+#
+# Return re-processed root-dir of _filepath.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filer(_filepath)
+#
+# Return re-processed root of _filepath.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filed(_filepath)
+#
+# Return re-processed dir of _filepath.
+# If _filepath=="" then no action occured and return "".
+# There is only one case when dir string can be =="" - when in
+# _filepath specified unmounted drive(MS-format) and from-
+# current-location address used(like Z:file.ext). In this
+# case no rootdir-cache-record will be created.
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+# fn _filene(_filepath)
+#
+# Return re-processed name-ext of _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function return result only if in _filepath present file-name(name
+# and/or extension) - otherwise its return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _filen(_filepath)
+#
+# Return re-processed name of _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function return result only if in _filepath present name field -
+# - otherwise its return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+# fn _file(_filepath)
+#
+# Return re-processed ext of _filepath.
+# If _filepath=="" then no action occured and return "".
+# Function return result only if in _filepath present ext field -
+# - otherwise its return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+#___________________________________________________________________________________
+#
+# fn _dir(_ARR,_filepathmask)
+#
+# Get file-/folder-list of root-folder of _filepathmask.
+# If _filepathmask=="" then no action occured and return "".
+# _filepathmask can contain symbols like `*' and `?' as like
+# its used in `dir'-shell command.
+# Function gets file-/folder-list of specified root-dir-_filepathmask
+# and return this list in array _ARR - where each element:
+#
+# index - is the _filepath of file-or-folder name-ext
+# value - contains 3 fields separated by " ":
+# 1. =="D" if this is folder
+# ==/[0-9]+/ if this is file - size of file in bytes
+# 2. ==date-of-creation of file or folder
+# 3. ==time-of-creation of file or folder
+#
+# Function returns quantity of items in ARR.
+#___________________________________________________________________________________
+#
+# fn _filexist(_filepath)
+#
+# Test if file or path or drive specified in _filepath is exist.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+# Function returns _filepath if _filepath is exist. Otherwise
+# function return 0.
+#_____________________________________________________________________________
+#
+# fn _filenotexist(_filepath)
+#
+# Test if file or path or drive specified in _filepath is not exist.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+# Function returns 1 if _filepath is not exist. Otherwise function
+# return 0.
+#_____________________________________________________________________________
+#
+# fn _newdir(_filepath)
+#
+# Create path specified in root-dir-_filepath.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+# Function returns root-dir of _filepath.
+#_______________________________________________________________________
+#
+# fn _newdir(_filepath)
+#
+# Create path specified in root-dir-_filepath. If this folder
+# already exist then it will be completely cleared.
+# If _filepath=="" then no action occured and return "".
+# If some syntax error found in _filepath then function return ""
+# (and NO _filepath-cache-record will be created!).
+# Function returns root-dir of _filepath.
+#___________________________________________________________________________________
+#
+# fn _getmpfile(_filepath,_currfilepath)
+#
+# Return ....
+#
+#_____________________________________________________________________________
+#
+# fn _getmpdir(_filepath,_currfilepath)
+#
+# Return ...
+#
+#_____________________________________________________________________________
+#
+# Temporary files folder.
+#
+# Temporary files folder location is defined by _FILEIO_TMPRD.
+# If it wasn't been initialized before program run or not been initialized
+# by ENVIRON["TMPDIR"] then it will defined as the:
+# `current rootdir(stored in _FILEIO_RD)\programname.TMP'
+# In this case if its already exist then it will completely cleared when _FILEIO
+# library initialization processed.
+# And at the program uninitialization processed it will completely
+# cleared if _FILEIO_TMPCLRFLAG is true.
+#___________________________________________________________________________________
+#
+# var _FILEIO_RD (ENVIRON["CD"])
+#
+# This var can be set before running program. It can contain path which
+# will be used as default current dir while program run.
+# If this var is set before program runs - then it will be refreshed by the
+# _filerd it will be used as default current dir while program run.
+# If this var is not set before program runs - then ENVIRON["CD"] can also
+# set up default current dir while program run. If it set before program
+# begin then it will be refreshed by the _filerd - and also writed into
+# _FILEIO_RD.
+# If both _FILEIO_RD and ENVIRON["CD"] are not set before program begins
+# then real current root\dir will be writed into both _FILEIO_RD and
+# ENVIRON["CD"] and it will be used as default current dir while program run.
+#
+#___________________________________________________________________________________
+#
+# var _FILEIO_TMPRD (ENVIRON["TMPRD"])
+#
+# This var can be set before running program. It can contain path which
+# will be used as default temporary files root-folder while program run.
+# If this var is set before program runs - then it will be refreshed by the
+# _filerd - and also writed into ENVIRON["TMPRD"].
+# If this var is not set before program runs - then ENVIRON["TMPRD"] can also
+# set up default temporary files root-folder while program run. If it set
+# before program begin then it will be refreshed by the _filerd - and
+# also writed into _FILEIO_TMPRD.
+# If both _FILEIO_TMPRD and ENVIRON["TMPRD"] are not set before program begins
+# then new folder into path specified by the _FILEIO_RD(after its handling)
+# will be writed into both _FILEIO_TMPRD and ENVIRON["TMPRD"] and it
+# will be used as default temporary files root-folder while program run.
+#___________________________________________________________________________________
+#
+# var _FILEPATH
+#
+# This var contain filepath of working script. It should be setting up externally.
+#
+# var _gawk_scriptlevel
+#___________________________________________________________________________________
+####################################################################################
+END{ ###############################################################################
+ if ( _constatstrln>0 ) _constat() }
+
+#_____________________________________________________________________________
+func _cmd(c, i,A) { #######################################################
+ _fio_cmda=RS; RS=".{1,}"; _fio_cmdb=BINMODE; BINMODE="rw"; ERRNO=RT=_NUL
+ c | getline RS; BINMODE=_fio_cmdb; RS=_fio_cmda
+ if ( ERRNO || 0>_exitcode=close(c) ) return RT=_NOP
+ return RT }
+
+
+#_____________________________________________________________________________
+func _con(t,ts, a,b,c,d,i,r,A,B) { ##########################################
+ d=RLENGTH
+ if ( (c=split(r=t,A,/\x0D?\x0A/,B))>0 ) {
+ a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+ if ( c>1 ) {
+ if ( (i=length(t=_tabtospc(A[1],ts,_conlastrln)))<_constatstrln ) {
+ t=t _getchrln(" ",_constatstrln-i) }
+ print (t B[1]) > _SYS_STDCON
+ for ( i=2; i<c; i++ ) {
+ print (_tabtospc(A[i],ts) B[i]) > _SYS_STDCON }
+ print (_conlastr=_tabtospc(A[c],ts)) > _SYS_STDCON; fflush(_SYS_STDCON) }
+ else {
+ print (t=_tabtospc(t,ts,_conlastrln)) > _SYS_STDCON; fflush(_SYS_STDCON)
+ _conlastr=_conlastr t }
+ if ( (i=length(_conlastr))>=_CON_WIDTH ) {
+ _conlastr=substr(_conlastr,1+(int(i/_CON_WIDTH)*_CON_WIDTH)) }
+ _conlastrln=length(_conlastr)
+ if ( _constatstr ) {
+ print ((t=_constatgtstr(_constatstr,_CON_WIDTH-1-_conlastrln)) _CHR["CR"] _conlastr) > _SYS_STDCON; fflush(_SYS_STDCON)
+ _constatstrln=length(t) }
+ BINMODE=a; ORS=b; RLENGTH=d; return r }
+ RLENGTH=d }
+#_______________________________________________________________________
+func _conl(t,ts) { ####################################################
+ return _con(t (t~/\x0A$/ ? "" : _CHR["EOL"]),ts) }
+#_______________________________________________________________________
+func _conline(t,ts) { #################################################
+ return _con(_chrline(t,ts)) }
+#_______________________________________________________________________
+func _constat(t,ts, ln,a) { ###########################################
+ if ( _constatstrln>(ln=length(t=_constatgtstr(_constatstr=_tabtospc(t,ts),_CON_WIDTH-1-_conlastrln))) ) {
+ t=t _getchrln(" ",_constatstrln-ln) }
+ _constatstrln=ln
+ ln=ORS; a=BINMODE; BINMODE="rw"; ORS=""
+ print (t _CHR["CR"] _conlastr) > _SYS_STDCON; fflush(_SYS_STDCON)
+ ORS=ln; BINMODE=a; return _constatstr }
+#_________________________________________________________________
+func _constatgtstr(t,ln, a,b) {
+ if ( ln<1 ) {
+ return "" }
+ if ( (a=length(t))<=ln ) {
+ return t }
+ if ( ln<11 ) {
+ return substr(t,a-ln+1) }
+ if ( ln<19 ) {
+ return "..." substr(t,a-ln+4) }
+ return substr(t,1,b=int((ln-3)/2)) "..." substr(t,a-ln+b+4) }
+#_______________________________________________________________________
+func _constatpush(t,ts) { #############################################
+ _CONSTATPUSH[++_CONSTATPUSH[0]]=_constatstr
+ if ( t ) _constat(t,ts)
+ return _constatstr }
+#_______________________________________________________________________
+func _constatpop() { ##################################################
+ if ( _CONSTATPUSH[0]>0 ) {
+ return _constat(_CONSTATPUSH[_CONSTATPUSH[0]--]) }
+ return _constat("") }
+#_______________________________________________________________________
+func _conin(t, a,b) { #################################################
+ _constatpush(); _constat(); a=BINMODE; b=RS; BINMODE="rw"; RS="\n"
+ _con(t); getline t < "CON"; close("CON"); _conlastrln=0; _conlastr=""
+ gsub(/[\x0D\x0A]+/,"",t)
+ BINMODE=a; RS=b; _constatpop()
+ return t }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+func _conlq(t,ts) {
+ return _conl("`" t "'",ts) }
+
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# var _SYS_STDOUT - (by default = "/dev/stdout") standart output pipe filename
+# var _SYS_STDERR - (by default = "/dev/stderr") standart error output pipe filename
+# var _SYS_STDCON - (by default = "CON") standart console output device
+#_____________________________________________________________________________
+# var _CHR["CR"] - return cursor to the position 0 without newline(normally ="\x0D")
+# var _CHR["EOL"] - return cursor to the position 0 & newline (MS:="\x0D\x0A" / UX:="\x0D")
+# var _CON_WIDTH - console width(columns number)
+#_____________________________________________________________________________
+# fn _cmd(c) - execute shell command c and return output
+# fn _err - output string w\o any addition into _SYS_STDERR device
+# fn _errnl - output string with addition _CHR["EOL"] at the end of the string into _SYS_STDERR device
+# fn _out - output string w\o any addition into _SYS_STDOUT device
+# fn _outnl - output string with addition _CHR["EOL"] at the end of the string into _SYS_STDOUT device
+#_____________________________________________________________________________
+# fn _con(text[,tabspace])
+# fn _conl(text[,tabspace])
+# fn _conline(text[,tabspace])
+# fn _constat(status[,tabspace])
+# fn _constatpush([status[,tabspace]])
+# fn _constatpop()
+#_______________________________________________________________________
+# var _constatstr
+####################################################################################
+
+
+func _unstr(t) { return gensub(/\\(.)/,"\\1","G",t) }
+#_____________________________________________________________________________
+func _gensubfn(t,r,f,p0, A) { ###############################################
+ if ( match(t,r,A) ) return substr(t,1,RSTART-1) @f(_th0(substr(t,RSTART,RLENGTH),t=substr(t,RSTART+RLENGTH)),A,p0) _gensubfn(t,r,f,p0)
+ return t }
+#_____________________________________________________________________________
+func _rexpstr(r, i,c,A) { ###################################################
+ c=split(r,A,""); r=""
+ for ( i=1; i<=c; i++ ) r=r _REXPSTR[A[i]]
+ return r }
+#_____________________________________________________________________________
+func _hexnum(n,l) { #########################################################
+ if ( l+0<1 ) l=2
+ return sprintf("%." (l+0<1 ? 2 : l) "X",n) }
+#_____________________________________________________________________________
+func _ln(t) { ###############################################################
+ return t~/\x0A$/ ? t : (t _CHR["EOL"]) }
+#_______________________________________________________________________
+func _getchrln(s,w) { #################################################
+ if ( s=="" ) return
+ #if ( w!=w+0 || w<0 ) w=_CON_WIDTH
+ if ( length(s)<w ) { if ( s in _GETCHRLN ) { if ( length(_getchrlnt0=_GETCHRLN[s])>=w ) return substr(_getchrlnt0,1,w) }
+ else _getchrlnt0=s s
+ while ( length(_getchrlnt0)<w ) _getchrlnt0=_getchrlnt0 _getchrlnt0
+ _GETCHRLN[s]=_getchrlnt0; return substr(_getchrlnt0,1,w) }
+ else return substr(s,1,w) }
+#_______________________________________________________________________
+func _chrline(t,ts,w,s) { #############################################
+ return (t=" " _tabtospc(t,ts) (t ? t~/[ \t]$/ ? "" : " " : "")) _getchrln(s ? s : "_",(w ? w : _CON_WIDTH-1)-length(t)) _CHR["EOL"] }
+#_______________________________________________________________________
+func _tabtospc(t,ts,xc, a,c,n,A,B) { ##################################
+ if ( !ts ) {
+ ts=_TAB_STEP_DEFAULT }
+ c=split("." t,A,/\t+/,B); A[1]=substr(A[1],2); t=""
+ for ( n=1; n<=c; n++ ) {
+ t=t A[n] _getchrln(" ",(xc=length(B[n])*ts+int((a=xc+length(A[n]))/ts)*ts)-a) }
+ return t }
+#_________________________________________________________________
+func _lspctab(t,ts,l, l1,l2,A) { ################################
+ while ( match(t,/^(\t*)( *)((\t*)(.*))$/,A) ) {
+ if ( A[1,"length"]>=l ) return substr(t,l+1)
+ if ( A[2] ) {
+ if ( (l1=int(A[2,"length"]/ts))>=(l2=l-A[1,"length"]) ) return substr(A[2],l2*ts+1) A[3]
+ if ( !A[4] ) return A[5]
+ t=A[1] _getchrln("\t",l1) A[3] }
+ else return t } }
+#_______________________________________________________________________
+func _qstr(t, c,A,B) { ################################################
+ c=""; for ( t=split(t,A,/[\x00-\x1F\\"]/,B); t>=0; t-- ) {
+ c=_QSTR[B[t]] A[t+1] c }
+ return c }
+#_________________________________________________________________
+func _qstrq(t) { ################################################
+ gsub(/\\/,"\\\\",t); gsub(/"/,"\\\"",t); return t }
+#_______________________________________________________________________
+func _Zexparr(S,s, t,i) { ##############################################
+ t=""; if ( isarray(S) ) {
+ for ( i in S ) {
+ t=t (isarray(S[i]) ? (_Zexparr_i1(i) "\x10" _Zexparr_i0(S[i]) "\x11\x11\x10" ) : (_Zexparr_i2(_Zexparr_i3(i) "\x11" _Zexparr_i3(S[i])) "\x10" ) ) } }
+ if ( s!="" ) {
+ gsub(/\x1B/,"\x1B\x3B",s)
+ gsub(/\x10/,"\x1B\x30",s)
+ t=t "\x11\x11\x10" s }
+ gsub(/\x0A/,"\x1B\x3A",t); return t }
+#_________________________________________________________________
+func _Zexparr_i0(S, t,i) {
+ for ( i in S ) {
+ t=t (isarray(S[i]) ? (_Zexparr_i1(i) "\x10" _Zexparr_i0(S[i]) "\x11\x11\x10" ) : (_Zexparr_i2(_Zexparr_i3(i) "\x11" _Zexparr_i3(S[i])) "\x10" ) ) }
+ return t }
+#_________________________________________________________________
+func _Zexparr_i1(t) {
+ gsub(/\x1B/,"\x1B\x3B",t); gsub(/\x11/,"\x1B\x31",t); gsub(/\x10/,"\x1B\x30",t)
+ return t }
+#_________________________________________________________________
+func _Zexparr_i2(t) {
+ gsub(/\x10/,"\x1B\x30",t); return t }
+#_________________________________________________________________
+func _Zexparr_i3(t) {
+ gsub(/\x1B/,"\x1B\x3B",t); gsub(/\x11/,"\x1B\x31",t)
+ return t }
+#_______________________________________________________________________
+func _Zimparr(D,t, A,B) { ##############################################
+ if ( isarray(D) ) {
+ split(t,A,/\x10/,B)
+ t=_Zimparr_i0(A,B,_Zimparr_i1(D,A,B,1))
+ gsub(/\x1B\x30/,"\x10",t)
+ gsub(/\x1B\x3B/,"\x1B",t)
+ return t } }
+#_________________________________________________________________
+func _Zimparr_i0(A,B,i) {
+ return i in A ? (A[i] B[i] _Zimparr_i0(A,B,i+1)) : "" }
+#_________________________________________________________________
+func _Zimparr_i1(D,A,B,i, t,a,n) {
+ while ( i in B ) {
+ if ( (t=A[i++])=="\x11\x11" ) return i
+ gsub(/\x1B\x30/,"\x10",t)
+ if ( (a=index(t,"\x11"))>0 ) {
+ if ( isarray(D[n=_Zimparr_i2(substr(t,1,a-1))]) ) {
+ delete D[n] }
+ D[n]=_Zimparr_i2(substr(t,a+1)) }
+ else {
+ if ( !isarray(D[t=_Zimparr_i2(t)]) ) {
+ delete D[t]; D[t][""]; delete D[t][""] }
+ i=_Zimparr_i1(D[t],A,B,i) } } }
+#_________________________________________________________________
+func _Zimparr_i2(t) {
+ gsub(/\x1B\x31/,"\x11",t); gsub(/\x1B\x3B/,"\x1B",t)
+ return t }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+#_______________________________________________________________________
+# _CHR array
+#
+# _CHR[ASC-code decimal number]=="char"
+#
+# Contains 256 elements. The index is the decimal number from 0-255.
+# The value is the single character with ASC-code equivalent to index number:
+#
+# _CHR[97] =="a" - character with ASC-code 97 is `a'
+#
+# This array is useful if you want to get character using it's ASC-code
+#_________________________________________________________________
+# _ASC array
+#
+# _ASC[char]==number: ASC-code of char
+#
+# Contains 256 elements. The index is the any single character with ASC-code \x00-\xFF.
+# The value is the number equivalent of character's ASC-code:
+#
+# _ASC["A"] ==65 - ASC-code of character `A' is 65
+#
+# This array is useful if you want to get ASC-code of the character.
+#_________________________________________________________________
+# _QASC array
+#
+# _QASC[char]=="string: octal ASC-code of char in 3-digit octal format"
+#
+# Contains 256 elements. The index is the any single charcter with ASC-code \x00-\xFF.
+# The value is the octal number equivalent of character's ASC-code in fixed-length - 3-digit - string:
+#
+# _QASC["!"] =="041" - ASC-code of character `!' is 33(decimal) == 41(in octal)
+# _QASC["\x0D"] =="015"
+#
+# This array is useful when some type of string escape conversion is performed. It allows quickly get
+# replace string for the characters that can be specified only by character code in result string:
+#
+# "\x0D" -> "\\015"
+#_______________________________________________________________________
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# fn _getchrln(ptt,len)
+#_____________________________________________________________________________
+# fn _tabtospc(src,tabstep,xcoord)
+####################################################################################
+
+#_____________________________________________________________________________
+func _retarr(A,i,p,a, q) { ##################################################
+ if ( isarray(A) ) {
+ i=i=="" ? 0 : i+0; q=A[_ARRLEN]+0
+ if ( i<q ) return p A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A,q,i,a)
+ } }
+
+func _retarr_i0(A,q,i,a) {
+ if ( i<q ) return A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A,q,i,a)
+ while ( q<i ) delete A[++q]
+ return a }
+#_____________________________________________________
+# _retarr(ARRAY,start,prefixtr,postfixtr)
+# Return string collected from elements of ARRAY.
+# The data elements in ARRAY have numeric indexes. By default it starts from element with index 1, but it is possible to locate elements starting from
+# 0,-1,-.... The last data element in the ARRAY have the highest numeric index that is stored in ARRAY[_ARRLEN].
+# Optimized for very large data size.
+#
+# IN: ARRAY - source data array(is ARRAY is not array then return undefined)
+# start - (optional) start index in ARRAY; if missed or have non-numeric value then start array index will be 1.
+# prefixst - the string that will be inserted in the begin of generated return string
+# postfix - the string that will be added at the end of generated return string
+# MOD: -
+# OUT: -
+# RETURN: undefined - if ARRAY is not array; if ARRAY is empty; if start is higher than ARRAY last element index
+# string - collected string: prefixtr-arraydata-postfixtr
+#_________________________________________________________________
+func _nretarr(A,i,v, r,q) { #####################################
+ if ( (i=i=="" ? 1 : i+0)<=(q=A[_ARRLEN]) ) {
+ if ( i<=(r=q-16) ) {
+ _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+ while ( i<r ) _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+ _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i)
+ return }
+ _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i)
+ return }
+ _ARRSTR=v
+ return }
+#___________________________________________________________
+func _nretarrd(A,i,v, r,q) { ##############################
+ if ( (i=i=="" ? 1 : i+0)<=(q=A[_ARRLEN]) ) {
+ if ( i<=(r=q-16) ) {
+ _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+ while ( i<r ) _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+ _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i) }
+ else _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i) }
+ else _ARRSTR=v
+ delete A; A[""]; delete A[""] }
+#_______________________________________________
+BEGIN{ _ARRLEN ="\x1ALEN"
+ _ARRPTR ="\x1APTR"
+ _ARRSTR="" }
+#_______________________________________________________________________
+func _movarr(D,S) { ###################################################
+ delete D; D[""]; delete D[""]
+ _addarr(D,S) }
+#_________________________________________________________________
+func _addarr(D,S) { #############################################
+ if ( isarray(S) ) _addarr_i0(D,S) }
+#_____________________________________________________
+func _addarr_i0(D,S, i) {
+ for ( i in S ) {
+ if ( isarray(S[i]) ) {
+ delete D[i]; D[i][""]; delete D[i][""]; _addarr_i0(D[i],S[i]) }
+ else {
+ delete D[i]; D[i]=S[i] } } }
+#_______________________________________________________________________
+func _addarrmask(D,S,M) { #############################################
+ for ( _addarrmaski0 in M ) { if ( _addarrmaski0 in S ) { if ( isarray(S[_addarrmaski0]) ) { if ( !isarray(D[_addarrmaski0]) ) { delete D[_addarrmaski0]; D[_addarrmaski0][""]; delete D[_addarrmaski0][""] }
+ if ( isarray(M[_addarrmaski0]) ) { _addarrmask(D[_addarrmaski0],S[_addarrmaski0],M[_addarrmaski0]) }
+ else { _extarr_i0(D[_addarrmaski0],S[_addarrmaski0]) } }
+ else { if ( isarray(D[_addarrmaski0]) ) delete D[_addarrmaski0]
+ D[_addarrmaski0]=S[_addarrmaski0] } }
+ else delete D[_addarrmaski0] } }
+#_______________________________________________________________________
+func _add(S,sf,D,df) { ################################################
+ if ( sf in S ) {
+ if ( isarray(S[sf]) ) {
+ if ( df in D ) {
+ if ( isarray(D[df]) ) return _extarr(D[df],S[sf])
+ delete D[df] }
+ D[df][""]; delete D[df][""]
+ return _extarr(D[df],S[sf]) }
+ else {
+ if ( isarray(D[df]) ) delete D[df]
+ D[df]=D[df] S[sf] } } }
+#_______________________________________________________________________
+func _ins(S,sf,D,df) { ################################################
+ if ( sf in S ) {
+ if ( isarray(S[sf]) ) {
+ if ( df in D ) {
+ if ( isarray(D[df]) ) return _extarr(D[df],S[sf])
+ delete D[df] }
+ D[df][""]; delete D[df][""]
+ return _extarr(D[df],S[sf]) }
+ else {
+ if ( isarray(D[df]) ) delete D[df]
+ D[df]=S[sf] D[df] } } }
+#_______________________________________________________________________
+func _cmparr(A0,A1,R, a,i) { ##########################################
+ a=0; delete R
+ for ( i in A0 ) {
+ if ( !(i in A1) ) {
+ a++; R[i]=0 }
+ else if ( A0[i]!=A1[i] ) {
+ a++; R[i]=2 } }
+ for ( i in A1 ) {
+ if ( !(i in A0) ) {
+ a++; R[i]=1 } }
+ return a }
+#_______________________________________________________________________
+func _deletepfx(A,f, B,le,i) { ########################################
+ le=length(f)
+ for ( i in A ) {
+ if ( substr(toupper(i),1,le)==f ) {
+ B[i]=A[i]; delete A[i] } } }
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+func _addlist(A,v) { ##################################################
+ A[++A[0]]=v }
+
+
+
+
+
+
+
+
+
+
+
+#_________________________________________________________________
+func _retarrd(A,v, i) { #########################################
+ if ( 1 in A ) return A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] A[11] A[12] A[13] A[14] A[15] A[16] ((i=17) in A ? _retarrd_i0(A,i) v : v)
+ delete A; return v }
+#_____________________________________________________
+func _retarrd_i0(A,i) {
+ if ( i in A ) return A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] (i in A ? _retarrd_i0(A,i) : "")
+ delete A }
+
+
+
+
+#_________________________________________________________________
+func _lengthsort(i1, v1, i2, v2) { ##############################
+ return length(i1)<length(i2) ? -1 : length(i1)>length(i2) ? 1 : i1<i2 ? -1 : 1 }
+
+
+#_______________________________________________________________________
+func _dumparr(A,t,lv, a) { ############################################
+ b=PROCINFO["sorted_in"]; PROCINFO["sorted_in"]="_lengthsort"
+ if ( isarray(A) ) {
+ delete _DUMPARR; _dumparrc=_dumparrd=""
+ _dumparr_i1(A,lv=(lv=="" ? 16 : lv==0 || (lv+0)!=0 ? lv : lv=="-*" ? -3 : lv~/^\+?\*$/ ? 3 : 16)+0,lv<0 ? -1 : 1,0,_tabtospc(t))
+ PROCINFO["sorted_in"]=a
+ return _retarrd(_DUMPARR,_dumparrd, _dumparrd="") } }
+#___________________________________________________________
+func _dumparr_i1(A,lv,ls,ln,t, t2,i,a,f) {
+ t2=_getchrln(" ",length(t))
+ if ( ln==lv ) { if ( ls>0 ) for ( i in A ) ++a
+ else for ( i in A ) isarray(A[i]) ? ++a : ""
+ if ( length(_dumparrd=_dumparrd t (a>0 ? " ... (x" a ")" : "") _CHR["EOL"])>262144 ) { _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" }
+ return }
+ if ( ls>=0 ) for ( i in A ) if ( !isarray(A[i]) ) if ( length(_dumparrd=_dumparrd (f ? t2 : t _nop(f=1)) "[" i "]=" A[i] "'" _CHR["EOL"])>262144 ) { _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" }
+ for ( i in A ) if ( isarray(A[i]) ) _dumparr_i1(A[i],lv,ls,ln+ls,_th0(f ? t2 : t,f=1) "[" i "]")
+ if ( !f ) if ( length(_dumparrd=_dumparrd t _CHR["EOL"])>262144 ) { _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" } }
+#_________________________________________________________________
+func _printarr(A,t,lv,r, a) { ####################################
+ a=PROCINFO["sorted_in"]; PROCINFO["sorted_in"]="_lengthsort"; _printarrexp=r ? r : ""
+ if ( isarray(A) ) {
+ delete _DUMPARR; _dumparrc=_dumparrd=""
+ _printarr_i1(A,lv=(lv=="" ? 16 : lv==0 || (lv+0)!=0 ? lv : lv=="-*" ? -3 : lv~/^\+?\*$/ ? 3 : 16)+0,lv<0 ? -1 : 1,0,_tabtospc(t))
+ PROCINFO["sorted_in"]=a
+ return _retarrd(_DUMPARR,_dumparrd, _dumparrd="") } }
+#___________________________________________________________
+func _printarr_i1(A,lv,ls,ln,t, t2,i,a,f) {
+ t2=_getchrln(" ",length(t))
+ if ( ln==lv ) { if ( ls>0 ) for ( i in A ) ++a
+ else for ( i in A ) isarray(A[i]) ? ++a : ""
+ if ( length(_dumparrd=_dumparrd t (a>0 ? " ... (x" a ")" : "") _CHR["EOL"])>262144 ) { _conl(_dumparrd); _dumparrd="" }
+ return }
+ if ( ls>=0 ) for ( i in A ) if ( !_printarrexp || i~_printarrexp ) if ( !isarray(A[i]) ) if ( length(_dumparrd=_dumparrd (f ? t2 : t _nop(f=1)) "[" i "]=" A[i] "'" _CHR["EOL"])>262144 ) { _conl(_dumparrd); _dumparrd="" }
+ for ( i in A ) if ( isarray(A[i]) ) if ( !_printarrexp || i~_printarrexp ) _printarr_i1(A[i],lv,ls,ln+ls,_th0(f ? t2 : t,f=1) "[" i "]")
+ if ( !f ) if ( length(_dumparrd=_dumparrd t _CHR["EOL"])>262144 ) { _conl(_dumparrd); _dumparrd="" } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+####################################################################################
+
+#_____________________________________________________________________________
+func _th0(p,p1,p2,p3) { return p } ##########################################
+#_________________________________________________________________
+func _th1(p0,p,p2,p3) { return p } ##############################
+#_________________________________________________________________
+func _th2(p0,p1,r,p3) { return p } ##############################
+#_________________________________________________________________
+func _th3(p0,p1,p2,r) { return p } ##############################
+#_________________________________________________________________
+func _th10(p0,p1) { return p1 p0 } ##############################
+#_______________________________________________________________________
+func _nop(p0,p1,p2,p3) { } ############################################
+#_______________________________________________________________________
+func _bearray(A) { ####################################################
+ if ( isarray(A) || (A==0 && A=="") ) return 1 }
+#_______________________________________________________________________
+func _setarrsort(f, a) { ##############################################
+ a=PROCINFO["sorted_in"]
+ if ( !f ) delete PROCINFO["sorted_in"]
+ else PROCINFO["sorted_in"]=f
+ return a }
+#_________________________________________________________________
+func cmp_str_idx(i1, v1, i2, v2) { ##############################
+ return i1 < i2 ? -1 : 1 }
+#___________________________________________________________
+func ncmp_str_idx(i1, v1, i2, v2) { #######################
+ return i1 < i2 ? 1 : -1 }
+#_______________________________________________________________________
+func _exit(c) { #######################################################
+ exit c }
+#_______________________________________________________________________
+func _fn(f,p0,p1,p2) { ################################################
+ if ( f in FUNCTAB ) return @f(p0,p1,p2) }
+#_______________________________________________________________________
+func _defn(f,c,v) { ###################################################
+ FUNCTAB[c f]=v }
+#_______________________________________________________________________
+func _delay(t, a) { ###################################################
+ for ( a=1; a<=t; a++ ) {
+ _delayms() } }
+#_________________________________________________________________
+func _delayms( a) { #############################################
+ for ( a=1; a<=_delay_perfmsdelay; a++ ) { } }
+#_______________________________________________________________________
+func _getdate() { #####################################################
+ return strftime("%F") }
+#_________________________________________________________________
+func _getime() { ################################################
+ return strftime("%H:%M:%S") }
+#_________________________________________________________________
+func _getsecond() { #############################################
+ return systime() }
+#___________________________________________________________
+func _getsecondsync( a,c,b,c2) { ##########################
+ a=systime()
+ while ( a==systime() ) { ++c }
+ return a+1 }
+#_______________________________________________________________________
+func _getperf(o,t, a) { ###############################################
+ o=="" ? ++_getperf_opcurr : _getperf_opcurr=o
+ if ( (a=_getsecond())!=_getperf_last ) {
+ _getperf_opsec=(_getperf_opcurr-_getperf_opstart)/((_getperf_last=a)-_getperf_start)
+ return @_getperf_fn(o,t,a) }
+ return 1 }
+#_____________________________________________________
+BEGIN{
+ _getperf_fn="_nop" }
+#___________________________________________________________
+func _getperf_noenot(o,t,a) { return 1 }
+#___________________________________________________________
+func _getperf_noe(o,t,a) {
+ if ( _getperf_opsecp!=_getperf_opsec ) { _constat((_constatstr==_getperf_stat ? _getperf_statstr : (_getperf_statstr=_constatstr)) t " [TIME=" (a-_getperf_start) " sec(" (_getperf_opsecp=_getperf_opsec) " ops/sec)]"); _getperf_stat=_constatstr }
+ return 1 }
+#___________________________________________________________
+func _getperf_not(o,t,a) {
+ if ( a<_getperf_end ) return 1 }
+#___________________________________________________________
+func _getperf_(o,t,a) {
+ if ( a>=_getperf_end ) return 0
+ if ( _getperf_opsecp!=_getperf_opsec ) { _constat((_constatstr==_getperf_stat ? _getperf_statstr : (_getperf_statstr=_constatstr)) t " [TIME=" (a-_getperf_start) " sec(" (_getperf_opsecp=_getperf_opsec) " ops/sec)]"); _getperf_stat=_constatstr }
+ return 1 }
+#_________________________________________________________________
+func _igetperf(t,s,o) { ######################################### # t-test period in seconds(==0 ? no period; s(=true/false)-output/not output status; o-qnt of ops before test start
+ if ( t==0 && t=="" && s==0 && s=="" && o==0 && o=="" ) {
+ if ( _getperf_fn!~/not$/ && _constatstr==_getperf_stat ) _constat(_getperf_statstr)
+ _getperf_fn="_nop"
+ return "[TIME=" (_getperf_last-_getperf_start) " sec(" _getperf_opsec " ops/sec)]" }
+ _conl("initiate _getperf")
+ _getperf_opstart=_getperf_opcurr=o+0; _getperf_opsec=_getperf_opsecp=_getperf_stat=_getperf_statstr=""
+ _getperf_end=t+(_getperf_start=_getperf_last=_getsecondsync())
+ _getperf_fn=(t+0>0 ? "_getperf_" : "_getperf_noe") (s ? "" : "not")
+ return _getperf_start }
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+func _addf(A,f) { #####################################################
+ A["B"][""]=A["F"][A["B"][f]=A["B"][""]]=f }
+#_________________________________________________________________
+func _insf(A,f) { ###############################################
+ A["F"][""]=A["B"][A["F"][f]=A["F"][""]]=f }
+#_________________________________________________________________
+func _delf(A,f) { ###############################################
+ A["B"][A["F"][A["B"][f]]=A["F"][f]]=A["B"][f]
+ delete A["F"][f]; delete A["B"][f] }
+#_______________________________________________________________________
+func _pass(A,f,t,p2, i,a) { ###########################################
+ a=_endpass_v0; _endpass_v0=""; i=1
+ while ( t && i ) { i=""; while ( (i=A[i]) && (t==(t=@i(f,t,p2))) ) { } }
+ if ( i && _endpass_v0 ) { A["!"]=1; t=_endpass_v0 }
+ else delete A["!"]
+ _endpass_v0=a; return t }
+#_________________________________________________________________
+func _endpass(t) { _endpass_v0=t } ########################
+#_________________________________________________________________
+func _inspass(A,f) { A[f]=A[""]; A[""]=f } ##################
+#_______________________________________________________________________
+func _fframe(A,t,p) { #################################################
+ return _fframe_i0(A,t,p,A[""]) }
+#___________________________________________________________
+func _fframe_i0(A,t,p,f) {
+ return f ? (@f(t,p) _fframe_i0(A,t,p,A[f])) : "" }
+#_________________________________________________________________
+func _bframe(A,t,p) { ###########################################
+ return _bframe_i0(A,t,p,A[""]) }
+#___________________________________________________________
+func _bframe_i0(A,t,p,f) {
+ return f ? (_bframe_i0(A,t,p,A[f]) @f(t,p)) : "" }
+#_________________________________________________________________
+func _insframe(A,f) { ###########################################
+ A[f]=A[""]; A[""]=f }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+func _fthru(A,c,p, B) {
+ return _fthru_i0(A,c,p,B,A[""]) }
+#_________________________________________________________________
+func _fthru_i0(A,c,p,B,f) {
+ return f ? @f(c,_fthru_i0(A,c,p,B,A[f]),B) : "" }
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+########################################################################
+#EXPERIMENTAL
+
+func _rexpfn(R,t,p) {
+ _REXPFN[""]=""
+ while ( t ) {
+ t=_rxpfn(R,t,p) }
+ return _REXPFN[""] }
+
+func _rxpfn(R,t,p, i,f,A) {
+ for ( i in R ) {
+ if ( match(t,i,A) ) {
+ f=R[i]; if ( t!=(t=@f(A,substr(t,RLENGTH+1),p)) ) return t } }
+ return _rexpfnend(t) }
+
+func _rexpfnend(t) {
+ _REXPFN[""]=t }
+
+
+func _ffaccr(A,t,p,P) {
+ return _faccr_i0(A["F"],t,p,P) }
+
+func _fbaccr(A,t,p,P) {
+ return _faccr_i0(A["B"],t,p,P) }
+
+func _faccr_i0(A,t,p,P, f,r) {
+ f=r=""
+ if ( isarray(A) ) {
+ while ( (f=A[f]) ) r=r @f(t,p,P) }
+ return r }
+
+func _ffaccl(A,t,p,P) {
+ return _faccl_i0(A["F"],t,p,P) }
+
+func _fbaccl(A,t,p,P) {
+ return _faccl_i0(A["B"],t,p,P) }
+
+func _faccl_i0(A,t,p,P, f,r) {
+ f=r=""
+ if ( isarray(A) ) {
+ while ( (f=A[f]) ) r=@f(t,p,P) r }
+ return r }
+
+
+func _Foreach(A,f, p0, i) {
+ for ( i in A ) @f(A,i,p0) }
+#_______________________________________________________________________
+func _foreach(A,f,r,p0,p1,p2, i,p) { ####################################
+ if ( isarray(A) ) {
+ _TMP0[p=_n()]["."]=1
+ _foreach_i0(A,f,_TMP0[p],p0,p1,p2)
+ return _th0(_retarr(_TMP0[p]),_tdel(p)) }
+ if ( _isptr(A) ) {
+ _TMP0[p=_n()][_ARRLEN]=1
+ _tframe4("_foreach_i1" (r ? "~" r : ""),A,f,_TMP0[p],p0,p1)
+ return _th0(_retarr(_TMP0[p]),_tdel(p)) } }
+ #_____________________________________________________
+ func _foreach_i0(A,f,D,p0,p1,p2) {
+ for ( i in A ) {
+ if ( isarray(A[i]) ) _foreach_i0(A[i],f,D,p0,p1,p2)
+ else _gen(D,@f(A[i],p0,p1,p2)) } }
+ #_____________________________________________________
+ func _foreach_i1(p,f,D,p0,p1,p2) {
+
+ _gen(D,@f(p,p0,p1,p2)) }
+
+BEGIN{
+ _datablock_length =262144 }
+
+func _gen(D,t) {
+ if ( length(D[D[_ARRLEN]]=D[D["."]] t)>_datablock_length ) {
+ D[++D[_ARRLEN]]="" } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# fn _th0,_th1,_th2,_th3
+# USAGE:
+# _th0(p1,p2,p3,p4)
+#
+# Each of this functions can have up to 4 parameters.
+# _th0(p1,p2,p3,p4) return 1st parameter (p1)
+# _th1(p1,p2,p3,p4) return 2nd parameter (p2)
+# _th2(p1,p2,p3,p4) return 3rd parameter (p3)
+# _th3(p1,p2,p3,p4) return 4th parameter (p4)
+#_____________________________________________________________________________
+# fn _nop(p1,p2,p3,p4,p5,p6,p7,p8)
+# USAGE:
+# _nop()
+#
+# Does not do any action. No result returned. Up to 8 parameters.
+#_____________________________________________________________________________
+# fn _exit(c)
+# USAGE:
+# _exit(code)
+#
+# This function do the same as GAWK-operator `exit code'.
+#_____________________________________________________________________________
+# fn _getdate()
+# fn _getime()
+# fn _getsecond()
+# fn _getsecondsync()
+func _rdreg(D,p) { ################################################################
+ _rdregp0="reg query \"" p "\" /S /reg:64 2>NUL"; _rdregfld=_rdregkey=0
+ _rdregq0=split(gensub(/[\x0D?\x0A]{2,}/,_CHR["EOL"],"G",_cmd(_rdregp0)),_RDREGA0,/\x0D?\x0A/)
+ while ( _rdregq0>0 ) _rdreg_i0(D)
+ return _rdregfld+_rdregkey }
+ #___________________________________________________________
+ func _rdreg_i0(D, A) { while ( _rdregq0>0 ){
+ if ( match(_rdregp0=_RDREGA0[_rdregq0--],/ (.*) REG_((SZ)|(DWORD)|(QWORD)|(BINARY)|(EXPAND_SZ)|(MULTI_SZ)) (.*)$/,A) ) {
+ if ( !_rdreg_i0(D) ) { ++_rdregfld; D[_rdregp0 A[1] "." _RDREGTYPE[A[2]]]=A[9]; return } else break }
+ else if ( _rdregp0~/^HK/ ) { ++_rdregkey; return D[_rdregp0=_rdregp0 "\\"] } } return 1 }
+ #_____________________________________________________
+ BEGIN { _initrdreg() }
+ func _initrdreg() { _RDREGTYPE["SZ"] ="STR"
+ _RDREGTYPE["DWORD"] ="W32"
+ _RDREGTYPE["QWORD"] ="W64"
+ _RDREGTYPE["BINARY"] ="BIN"
+ _RDREGTYPE["EXPAND_SZ"] ="XSZ"
+ _RDREGTYPE["MULTI_SZ"] ="MSZ"
+ _RDrdregfld=_rdregkey=0 }
+
+# _rdregfld : gvar - number of readed registry fields by _rdreg()
+# _rdregkey : gvar - number of readed registry keys by _rdreg()
+#_____________________________________________________________________________
+func _regpath0(D,i, s,q,S) { ############################################ 0 #
+ if ( i=_patharr0(S,i) ) {
+ if ( "name" in S ) D["name"]=S["name"]; if ( "ext" in S ) D["ext"]=S["ext"]
+ s=(toupper(s=i in S ? S[i] : "") in _REGPATH0REGDIR ? D[++q]=_REGPATH0REGDIR[toupper(s)] : (D[++q]=_REGPATH0REGDIR[""]) "\\" (D[++q]=s)) "\\"
+ while ( ++i in S ) s=s (D[++q]=S[i]) "\\"
+ if ( s!="" ) D[0]=s; IGNORECASE=1
+ D["hostdir"]="\\\\" (D["host"]="host" in S && ((""==i=S["host"]) || "."==i || "?"==i || "localhost"==i) ? ENVIRON["COMPUTERNAME"] : i) "\\" s; IGNORECASE=0 } }
+ #_____________________________________________________
+ BEGIN { _initregpath0() }
+ func _initregpath0() { _REGPATH0REGDIR[""] ="HKEY_LOCAL_MACHINE"
+ _REGPATH0REGDIR["HKLM"] ="HKEY_LOCAL_MACHINE"
+ _REGPATH0REGDIR["HKEY_LOCAL_MACHINE"] ="HKEY_LOCAL_MACHINE"
+ _REGPATH0REGDIR["HKCR"] ="HKEY_CLASSES_ROOT"
+ _REGPATH0REGDIR["HKEY_CLASSES_ROOT"] ="HKEY_CLASSES_ROOT"
+ _REGPATH0REGDIR["HKCU"] ="HKEY_CURRENT_USER"
+ _REGPATH0REGDIR["HKEY_CURRENT_USER"] ="HKEY_CURRENT_USER"
+ _REGPATH0REGDIR["HKU"] ="HKEY_USERS"
+ _REGPATH0REGDIR["HKEY_USERS"] ="HKEY_USERS"
+ _REGPATH0REGDIR["HKCC"] ="HKEY_CURRENT_CONFIG"
+ _REGPATH0REGDIR["HKEY_CURRENT_CONFIG"] ="HKEY_CURRENT_CONFIG"
+ _REGPATH0REGDIR["HKPD"] ="HKEY_PERFORMANCE_DATA"
+ _REGPATH0REGDIR["HKEY_PERFORMANCE_DATA"] ="HKEY_PERFORMANCE_DATA" }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _getreg_i1(D,r,R, a,i,il,ir,rc,B) {
+ a=IGNORECASE; IGNORECASE=1; r="^" _torexp(r); rc=0
+ zs=""
+ for ( i in R ) { if ( match(i,r,B) ) { il=B[_torexp_pfxcntr]; ir=gensub(/....$/,"",1,substr(i,1+B[_torexp_pfxcntr,"length"]))
+ if ( !gsub(/^\\/,"",ir) && match(il,/[^\\]+$/) ) ir=substr(il,RSTART) ir
+ D[ir]=R[i]; rc++ } }
+ IGNORECASE=a; if ( rc>0 ) return rc }
+#_________________________________________________________________________________________
+func _rrdreg(DD,p, k,t,v,c,i,q,tT,A,B,C,D) { ############################################# old; regedit
+ if ( !_registrytmpfile ) _registryinit()
+ _cmd("regedit /E \"" _registrytmpfile "\" \"" p "\" 2>&1")
+ q=patsplit(gensub(/[\x00\xFF\xFE]+/,"","G",_rdfile(_registrytmpfile)),A,/\x0D?\x0A\[[^\]]+\]\x0D?\x0A/,B)
+ for ( i=1; i<=q; i++ ) { p=gensub(/(^[ \t\x0D\x0A]*\[)|((\\)\\+)|(\][ \t\x0D\x0A]*$)/,"\\3","G",A[i]); DD[p "\\"]; delete C[split(B[i],C,/[\x0D\x0A]+/)]
+ for ( c=1; c in C; c++ ) { tt=tt C[c]; if ( gsub(/\\$/,"",tt) ) continue
+ if ( tt=="" ) continue
+ if ( match(_th0(tt,tt=""),/((^"(([^\\"]|\\.)*)")|(@))=(("(([^\\"]|\\.)*)")|(dword:([[:xdigit:]]{8}))|(hex(\(([27b])\))?:(.*)))$/,D) ) {
+ if ( D[7] ) { t="STR"; v=_unstr(D[8]) }
+ else if ( D[10] ) { t="W32"; v=D[11] }
+ else { v=D[15]
+ if ( D[13] ) { switch ( D[14] ) {
+ case "2": t="XSZ"; break
+ case "7": t="MSZ"; break
+ default: t="W64" } }
+ else t="BIN" }
+ DD[gensub(/(\\)\\+/,"\\1","G",p "\\" _unstr(D[3] (D[5] ? "(Default)" : "")) "." t)]=v }
+ else _fatal("regedit: unknown output format(" c "): `" C[c] "'") } } }
+ #_____________________________________________________
+ func _registryinit() { _registrytmpfile=_getmpfile() }
+#_____________________________________________________________________________
+# _rdreg(ARRAY,reg_path)
+# Import into ARRAY the content of the whole registree tree with the higher point specified by reg_path.
+# ARRAY will be filled by the strings with following format:
+#
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck\InstallPath.STR=C:\Program Files (x86)\GnuWin32
+# where:
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck <- REG KEY PATH
+# InstallPath <- DATA FIELD
+# STR <- TYPE
+# C:\Program Files (x86)\GnuWin32 <- VALUE
+# TYPE:
+# STR - REG_SZ (String Value)
+# W32 - REG_DWORD (DWORD (32-bit) Value)
+# W64 - REG_QWORD (QWORD (64-bit) Value)
+# BIN - REG_BINARY (Binary Value)
+# XSZ - REG_EXPAND_SZ (Expandable String Value)
+# MSZ - REG_MULTI_SZ (Multi-String Value)
+#_________________________________________________________________________________________
+
+
+
+
+# HKCR HKEY_CLASSES_ROOT
+# HKCU HKEY_CURRENT_USER
+# HKLM HKEY_LOCAL_MACHINE
+# HKU HKEY_USERS
+# HKCC HKEY_CURRENT_CONFIG
+# HKPD HKEY_PERFORMANCE_DATA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _sysinfo(D,h) { ##############################################################
+ h="wmic /NODE: \"" h "\" OS 2>NUL"
+ if ( split(_cmd(h),_SYSINFOA0,/[\x0D\x0A]+/)==3 ) {
+ _sysinfol0=length(h=_SYSINFOA0[2])+1; _sysinfoq0=_sysinfoq1=split(_SYSINFOA0[1],_SYSINFOA0,/ +/,_SYSINFOB0)
+ while ( --_sysinfoq0>0 ) D[_sysinfof0]=gensub(/^ +| +$/,"","G",substr(h,_sysinfol0=_sysinfol0-(_sysinfol1=length(_sysinfof0=_SYSINFOA0[_sysinfoq0])+length(_SYSINFOB0[_sysinfoq0])),_sysinfol1))
+ return _sysinfoq1-1 } }
+#_____________________________________________________________________________
+func zzer() { ################################################################
+ }
+ #_____________________________________________________
+ BEGIN { _initsys() }
+ func _initsys() { }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+#BootDevice BuildNumber BuildType Caption CodeSet CountryCode CreationClassName CSCreationClassName CSDVersion CSName CurrentTimeZone DataExecutionPrevention_32BitApplications DataExecutionPrevention_Available DataExecutionPrevention_Drivers DataExecutionPrevention_SupportPolicy Debug Description Distributed EncryptionLevel ForegroundApplicationBoost FreePhysicalMemory FreeSpaceInPagingFiles FreeVirtualMemory InstallDate LargeSystemCache LastBootUpTime LocalDateTime Locale Manufacturer MaxNumberOfProcesses MaxProcessMemorySize MUILanguages Name NumberOfLicensedUsers NumberOfProcesses NumberOfUsers OperatingSystemSKU Organization OSArchitecture OSLanguage OSProductSuite OSType OtherTypeDescription PAEEnabled PlusProductID PlusVersionNumber Primary ProductType RegisteredUser SerialNumber ServicePackMajorVersion ServicePackMinorVersion SizeStoredInPagingFiles Status SuiteMask SystemDevice SystemDirectory SystemDrive TotalSwapSpaceSize TotalVirtualMemorySize TotalVisibleMemorySize Version WindowsDirectory
+#\Device\HarddiskVolume1 7601 Multiprocessor Free Microsoft Windows Server 2008 R2 Enterprise 1252 1 Win32_OperatingSystem Win32_ComputerSystem Service Pack 1 CPU 180 TRUE TRUE TRUE 3 FALSE FALSE 256 0 6925316 33518716 41134632 20110502192745.000000+180 20130426120425.497469+180 20130510134606.932000+180 0409 Microsoft Corporation -1 8589934464 {"en-US"} Microsoft Windows Server 2008 R2 Enterprise |C:\Windows|\Device\Harddisk0\Partition2 0 116 2 10 64-bit 1033 274 18 TRUE 3 Windows User 55041-507-2389175-84833 1 0 33554432 OK 274 \Device\HarddiskVolume2 C:\Windows\system32 C: 50311020 16758448 6.1.7601 C:\Windows
+
+
+
+
+
+
+
+
+
+
+
+
+
+BEGIN { ############################################################################
+
+ a=ENVIRON["EGAWK_CMDLINE"]; gsub(/^[ \t]*/,"",a)
+ a=_lib_CMDLN(a)
+ if ( (a!="") && (!_LIBAPI["F"]["!"]) ) { _out(_lib_HELP()); _fatal("Bad comandline argument `" a "'") }
+ gsub(/^[ \t]*/,"",a); ENVIRON["EGAWK_CMDLINE"]=a
+ _lib_APPLY(); if ( _basexit_fl ) exit
+ _INIT()
+ _START()
+ _END() }
+#___________________________________________________________________________________
+func _INITBASE() { ################################################################
+
+ _egawk_utilpath =ENVIRON["EGAWK_PATH"] "BIN\\UTIL\\" }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+# make sure that stdout contain only expected characters
+# make sure that stderr contain only expected characters
+# redesign & reformat keys and its outputs
+# try different key combinations
+# add lib-specified to all libs
+