;######################################################################################### ; SimpleArray by Infogulch ;######################################################################################### ; v2 : http://www.autohotkey.com/forum/viewtopic.php?p=216134#216134 ;######################################################################################### SA_Set( Array, Val, nIdx="+1", Insert=false, giveName=0 ) { Idx := SA_IdxName(Array, nIdx) If (ErrorLevel || !nIdx) return Array return SA_Set_(Array, Val, (Idx ? Idx : nIdx), (Idx && giveName+0 != "" ? nIdx : giveName), Insert) } SA_Set_( ByRef Array, Val, Idx="+1", giveName="", Insert=false ) { ;only pass an integer for index Count := SA_Len(Array) If (SubStr(Idx, 1, 1) = "+") Idx += Count Loop % Idx - Count Array .= "" StringGetPos, lPos, Array, , % Idx>0 ? "L" Idx-1 : "R" Abs(Idx) lStr := SubStr( Array, 1, lPos+ErrorLevel ) lPos+=2 If Insert rStr := SubStr(Array, lPos) Else If isNext:=InStr(Array, "", 0, lPos) rStr := SubStr(Array, isNext+1) return (lStr="" ? "" : lStr "") . (SA_ValidName(giveName) ? SA_Enc(giveName) ":" : "") . SA_Enc(Val) . (rStr="" ? "" : "" rStr) } SA_Get( Array, nIdx1=1, nIdx2="", nIdx3="", nIdx4="", nIdx5="" ) { Loop If !nIdx%A_Index% || (!(nameIdx:=SA_IdxName(Array, nIdx%A_Index%)) && ErrorLevel) Break Else Array := SA_Get_(Array, nameIdx ? nameIdx : nIdx%A_Index%) Return Array } SA_Get_( ByRef Array, Idx=1 ) { ;only pass an integer for Idx StringGetPos, lPos, Array, , % Idx>0 ? "L" Idx-1 : "R" Abs(Idx) StringGetPos, rPos, Array, , L1, lPos+1 ; use instr If ErrorLevel rPos := StrLen(Array) lPos += 2 return SA_Dec( SubStr(Array,lPos, rPos+1 - lPos) ) } SA_Del( Array, nIdxFm, nIdxTo="", Count=0 ) { If !nIdxFm || ((!IdxTo := SA_IdxName(Array, nIdxTo)) && ErrorLevel) || ((!IdxFm := SA_IdxName(Array, nIdxFm)) && ErrorLevel) return Array IdxFm := IdxFm ? IdxFm : nIdxFm IdxTo := IdxTo ? IdxTo : nIdxTo If (!Count && nIdxTo!="") { tot := SA_Len( Array ) cnt := Abs((IdxTo > 0 ? IdxTo : tot + IdxTo + 1)-(IdxFm > 0 ? IdxFm : tot + IdxFm + 1)) } Else cnt := 1 return SA_Del_( Array, IdxFm, Count ? Count : cnt ) } SA_Del_( ByRef Array, IdxFm, cnt=1 ) { ;only pass an integer for Idx StringGetPos, lPos, Array, , % IdxFm>0 ? "L" IdxFm-1 : "R" Abs(IdxFm) lStr := SubStr(Array, 1, lPos += ErrorLevel) StringGetPos, rPos, Array, , % "L" cnt+0, lPos + 1 rStr := !ErrorLevel ? SubStr(Array, rPos+2) : "" return lStr (lStr!="" && rStr!="" ? "" : "") rStr } SA_Trim( Array, nIdxFm, nIdxTo=-1 ) { If !nIdxFm || !nIdxTo || ((!IdxTo := SA_IdxName(Array, nIdxFm)) && ErrorLevel) || ((!IdxFm := SA_IdxName(Array, nIdxFm)) && ErrorLevel) return Array return SA_Trim_( Array, (IdxFm ? IdxFm : nIdxFm), (IdxTo ? IdxTo : nIdxTo)) } SA_Trim_( ByRef Array, IdxFm, IdxTo=-1 ) { ;only pass an integer for Idx StringGetPos, lPos, Array, , % IdxFm > 0 ? "L" IdxFm - 1 : "R" Abs(IdxFm) StringGetPos, rPos, Array, , % IdxTo > 0 ? "L" IdxTo : "R" Abs(IdxTo) - 1 return SubStr(Array, lPos+2, rPos - lPos - 1) } SA_Len( Array ) { StringReplace, blank, Array, ,, UseErrorLevel retVal := ErrorLevel + 1 ErrorLevel := 0 return retVal } SA_IdxName( Array, Name ) { ;returns the index of Name in Array as a number If !SA_ValidName(Name) return ErrorLevel := 0 StringGetPos, Pos, Array, % SA_Enc(Name) ":" Pos := RegExMatch(Array, "(^|)" SA_EncRE(SA_Enc(Name)) "\:") If ErrorLevel return RegExReplace(Array, "", "", reC, -1, Pos+1) return SA_Len(Array) - reC } SA_NameIdx( Array, Idx ) { ;returns the name (if any) of Idx as a string If !(Idx + 0) return StringGetPos, lPos, Array, , % Idx>0 ? "L" Idx-1 : "R" Abs(Idx) StringGetPos, rPos, Array, , L1, lPos+1 ; use instr If ErrorLevel rPos := StrLen(Array) lPos += 2 Ele := SubStr(Array, lPos, rPos+1 - lPos) return SA_Dec( SubStr(SubStr(Ele, 1, InStr( Ele, ":" )), 1, -1) ) } ; These functions are used internally: SA_Enc( x ) { ; returns a value ready to be used as an element or name StringReplace, x, x, , e, All ; e(ncoding char) StringReplace, x, x, , d, All ; d(elimeter char) StringReplace, x, x, :, n, All ; n(ame of value) return x } SA_Dec( x ) { ; returns a value ready to be used outside the array by decoding characters encoded earlier and removing any names x := SubStr(x, InStr(x,":")+1) ; remove name StringReplace, x, x, n, :, All ; n(ame char) StringReplace, x, x, d, , All ; d(elimeter char) StringReplace, x, x, e, , All ; e(ncoding char) return x } SA_ValidName( x ) { ; returns true if the value passed is acceptable as a name return x + 0 != "" || !x ? False : True ;non-blank and not a number } SA_EncRE( x ) { c := "\.*?+[]{}|()^$ " Loop, Parse, c StringReplace, x, x, %A_LoopField%, \%A_LoopField%, All return x }