-
Posts
29 -
Joined
-
Last visited
Everything posted by AGlassman
-
@error lost on Return without SetError?
AGlassman replied to AGlassman's topic in AutoIt General Help and Support
Danp2 - It does not appear to have anything to do with calling ConsoleWrite (see code below). Inside FuncR @error is non-zero. But on return from the function it has been reset to zero. Which I could accept as "That's just how it works. Return resets @error. Add it to the AutoIt Gotcha! list". Except that doing a "SetError", instead of calling code that sets @error (see FuncT), seems to have some sort of side effect that makes the @error value "stick" on return. Main() Func Main() ConsoleWrite( "@AutoItVersion = " & @AutoItVersion & @CRLF ) RegRead( "XXX", "" ) If Not @error Then ConsoleWrite( "After RegRead. @error is Zero" & @CRLF ) FuncR( ) If Not @error Then ConsoleWrite( "After FuncR Call. @error is Zero" & @CRLF ) FuncT( ) If Not @error Then ConsoleWrite( "After FuncT Call. @error is Zero" & @CRLF ) EndFunc Func FuncR( ) RegRead( "XXX", "" ) If Not @error Then ConsoleWrite( "Before FuncR Return. @error is Zero" & @CRLF ) Return EndFunc Func FuncT( ) SetError( 2 ) If Not @error Then ConsoleWrite( "Before FuncT Return. @error is Zero" & @CRLF ) Return EndFunc --- Output --------------------------------------------------------------------- @AutoItVersion = 3.3.16.1 After FuncR Call. @error is Zero +>21:01:35 AutoIt3.exe ended.rc:0 -
@error lost on Return without SetError?
AGlassman replied to AGlassman's topic in AutoIt General Help and Support
Danp2 - I'm not sure I understand how your Help file reference applies in this case. I am not concerned with @extended or the returned value. Only @error. ioa747. It would seem that ConsoleWrite is NOT reseting @error. It would appear that @error only gets reset to zero after returning from FuncR. Main() Func Main() ConsoleWrite( "@AutoItVersion = " & @AutoItVersion & @CRLF ) RegRead( "XXX", "" ) ConsoleWrite( "RegRead. @error = " & @error & @CRLF ) FuncR( ) ConsoleWrite( "FuncR Return. @error = " & @error & @CRLF ) FuncS( ) ConsoleWrite( "FuncS Return. @error = " & @error & @CRLF ) EndFunc Func FuncR( ) RegRead( "XXX", "" ) ConsoleWrite( "FuncR 1st Write. @error = " & @error & @CRLF ) ConsoleWrite( "FuncR 2nd Write. @error = " & @error & @CRLF ) EndFunc Func FuncS( ) RegRead( "XXX", "" ) SetError( @error ) ConsoleWrite( "FuncS. @error = " & @error & @CRLF ) EndFunc -- Output --------------------------------------------------------------------- @AutoItVersion = 3.3.16.1 RegRead. @error = 2 FuncR 1st Write. @error = 2 FuncR 2nd Write. @error = 2 FuncR Return. @error = 0 FuncS. @error = 2 FuncS Return. @error = 0 -
The Help file is very explicit about @error being reset to zero on entry to a User Function. But it is silent (as far as I can tell) about @error on Return from a Function. So I don't understand what is happening in this code. Why does FuncR( ) return @error = 0? Why does "SetError( @error )" in FuncS make it work the way I expected? As I read it, "SetError( @error )" says "Set @error equal to @error". Which would seem to be a NoOp. Main() Func Main() ConsoleWrite( "@AutoItVersion = " & @AutoItVersion & @CRLF ) RegRead( "XXX", "" ) ConsoleWrite( "RegRead. @error = " & @error & @CRLF ) FuncR( ) ConsoleWrite( "FuncR. @error = " & @error & @CRLF ) FuncS( ) ConsoleWrite( "FuncS. @error = " & @error & @CRLF ) EndFunc Func FuncR( ) RegRead( "XXX", "" ) EndFunc Func FuncS( ) RegRead( "XXX", "" ) SetError( @error ) EndFunc -- Output --------------------------------------------------------------------- @AutoItVersion = 3.3.16.1 RegRead. @error = 2 FuncR. @error = 0 FuncS. @error = 2
-
Which Debugger do you use?
AGlassman replied to noellarkin's topic in AutoIt General Help and Support
I sprinkle my code with calls to this func. Disable/enable with a Ctrl-Q as needed. Shows me the Function , step, and multiple variable names and values on one line. (All of my Func have a "Local Const $ThisFunc = "Func Name" line right after the Func definition). #include-once ; ===================================================================== ; ; #include "HotRod\hr_Debug_Print.au3" ; ; Example Calls: ; ; hr_Debug_Print( $ThisFunc, "StepName", "MsgText", "$P1Name", $P1Value, ... ) ; hr_Debug_Print( $ThisFunc, "StepName", Default, "$P1Name", $P1Value, ... ) ; hr_Debug_Print( $ThisFunc, Default, Default, "$P1Name", $P1Value, ... ) ; ; hr_Debug_Print( $ThisFunc, "StepName", _ ; "MsgText", _ ; "$P1Name", $P1Value, ... ) ; ; ===================================================================== Func hr_Debug_Print( _ Const $FuncName = Default, _ $StepName = Default, _ $MsgText = Default, _ $P1Name = Default, $P1Value = Default, _ $P2Name = Default, $P2Value = Default, _ $P3Name = Default, $P3Value = Default, _ $P4Name = Default, $P4Value = Default, _ $P5Name = Default, $P5Value = Default, _ $P6Name = Default, $P6Value = Default, _ $P7Name = Default, $P7Value = Default, _ $P8Name = Default, $P8Value = Default, _ $P9Name = Default, $P9Value = Default _ ) Local $MsgStrg = "DEBUG_PRINT" If NOT ( ( $FuncName = Default ) OR ( $FuncName = "") ) Then $MsgStrg = $MsgStrg & " | " & $FuncName EndIf If NOT ( ( $StepName = Default ) OR ( $StepName = "") ) Then $MsgStrg = $MsgStrg & " | " & $StepName EndIf If NOT ( ( $MsgText = Default ) OR ( $MsgText = "") ) Then $MsgStrg = $MsgStrg & " | " & $MsgText EndIf If $P1Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P1Name & ": '" & $P1Value & "'" If $P2Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P2Name & ": '" & $P2Value & "'" If $P3Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P3Name & ": '" & $P3Value & "'" If $P4Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P4Name & ": '" & $P4Value & "'" If $P5Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P5Name & ": '" & $P5Value & "'" If $P6Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P6Name & ": '" & $P6Value & "'" If $P7Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P7Name & ": '" & $P7Value & "'" If $P8Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P8Name & ": '" & $P8Value & "'" If $P9Name <> Default Then $MsgStrg = $MsgStrg & " | " & $P9Name & ": '" & $P9Value & "'" ConsoleWrite( $MsgStrg & @CRLF ) EndFunc -
Am I doing something wrong, or does Au3Stripper not process Global Enum's? Original #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/pe #AutoIt3Wrapper_Au3stripper_OnError=S Global Enum $GlobalEnumVar Global Const $GlobalConstVar = 0 Main() Func Main() ConsoleWrite( "AutoItVersion: " & @AutoItVersion & @CRLF ) ConsoleWrite( "$GlobalEnumVar: " & $GlobalEnumVar & @CRLF ) ConsoleWrite( "$GlobalConstVar: " & $GlobalConstVar & @CRLF ) EndFunc Build >Running Au3Stripper (21.316.1639.0) from:C:\Progs\Apps\AutoIt\SciTE\Au3Stripper cmdline: - 0.03 Iteration 1 Strip Functions result: Output 8 lines, stripped 0 Func lines and 8 Commentlines - 0.03 Iteration 2 Strip Variables result: Output 8 lines and stripped 0 lines - 0.03 Iteration 3 Strip Variables result: Output 7 lines and stripped 1 lines - 0.03 Iteration 4 Strip Variables result: Output 7 lines and stripped 0 lines +> Source 16 lines 360 Characters. +> Stripped 1 Func/Var lines and 8 comment lines, Total 132 Characters. +> Saved 56% lines 36% Characters. +> Au3Stripper v21.316.1639.0 finished created:C:\HotRod\AU3\TEST\Au3Stripper\Au3Stripper_stripped.au3 +>04:23:07 Au3Stripper ended.rc:0 Stripped Global Enum $GlobalEnumVar Main() Func Main() ConsoleWrite( "AutoItVersion: " & @AutoItVersion & @CRLF ) ConsoleWrite( "$GlobalEnumVar: " & $GlobalEnumVar & @CRLF ) ConsoleWrite( "$GlobalConstVar: " & 0 & @CRLF ) EndFunc It replaced $GlobalConstVar with it's value. But it left $GlobalEnumVar.
-
StringInStr occurrence Default = -1?
AGlassman replied to AGlassman's topic in AutoIt General Help and Support
Thank you Melba23. I have added a "Default is not always default" section to my AutoIt Gotcha book. -
What am I missing here? The Help file clearly shows the default for occurrence = 1. But the "Default" keyword seems to be interpreted as -1. ConsoleWrite( "AutoItVersion: " & @AutoItVersion & @CRLF ) Local $S = "ABCDABCD" Local $Start = StringInStr( $S, "AB" ) ConsoleWrite( "$Start = " & $Start & @CRLF ) Local $EndOne = StringInStr($S, "AB", Default, 1, $Start +1 ) ConsoleWrite( "$EndOne = " & $EndOne & @CRLF ) Local $EndDefault = StringInStr($S, "AB", Default, Default, $Start +1 ) ConsoleWrite( "$EndDefault = " & $EndDefault & @CRLF ) Local $EndMinusOne = StringInStr($S, "AB", Default, -1, $Start +1 ) ConsoleWrite( "$EndMinusOne = " & $EndMinusOne & @CRLF ) --------------------------------------------------------------------- AutoItVersion: 3.3.16.1 $Start = 1 $EndOne = 5 $EndDefault = 1 $EndMinusOne = 1
-
As best as I can tell (see example code and output) the "ACTIVE" property, unlike the other properties, is OR'd not AND'd with any other properties present. I can fully understand if this was by design. But if so, then a note on the "Window Titles and Text (Advanced)" help page might be in order. #include <WinAPISysWin.au3> Example() Func Example() ConsoleWrite( "AutoItVersion: " & @AutoItVersion & @CRLF ) Local $hWnd = WinGetHandle( "[ACTIVE]" ) Local $Title = StringRight( WinGetTitle($hWnd), 5 ) ConsoleWrite( "Active Window Title match string: '" & $Title & "'" & @CRLF ) Local $Class = _WinAPI_GetClassName( $hWnd ) ConsoleWrite( "Active Window Class match string: '" & $Class & "'" & @CRLF ) ConsoleWrite( @CRLF ) Local $AWD_RETitle = "[REGEXPTITLE:" & $Title & "]" ConsoleWrite( "RETitle Property: '" & $AWD_RETitle & "'" & @CRLF ) ConsoleWrite( "RETitle Match: " & WinExists( $AWD_RETitle ) & @CRLF ) Local $AWD_REClass = "[REGEXPCLASS:" & $Class & "]" ConsoleWrite( "REClass Property: '" & $AWD_REClass & "'" & @CRLF ) ConsoleWrite( "REClass Match: " & WinExists( $AWD_REClass ) & @CRLF ) Local $AWD_RETC = "[REGEXPTITLE:" & $Title & "; REGEXPCLASS:" & $Class & "]" ConsoleWrite( "RETC Property: '" & $AWD_RETC & "'" & @CRLF ) ConsoleWrite( "RETC Match: " & WinExists( $AWD_RETC ) & @CRLF ) $Class = "XXXX" Local $AWD_RETC = "[REGEXPTITLE:" & $Title & "; REGEXPCLASS:" & $Class & "]" ConsoleWrite( "RETC Property: '" & $AWD_RETC & "'" & @CRLF ) ConsoleWrite( "RETC Match: " & WinExists( $AWD_RETC ) & @CRLF ) $Title = "XXXX" Local $AWD_RETA = "[REGEXPTITLE:" & $Title & "; ACTIVE]" ConsoleWrite( "RETA Property: '" & $AWD_RETA & "'" & @CRLF ) ConsoleWrite( "RETA Match: " & WinExists( $AWD_RETA ) & @CRLF ) Local $AWD_RETCA = "[REGEXPTITLE:" & $Title & "; REGEXPCLASS:" & $Class & "; " & "ACTIVE" & "]" ConsoleWrite( "RETCA Property: '" & $AWD_RETCA & "'" & @CRLF ) ConsoleWrite( "RETCA Match: " & WinExists( $AWD_RETCA ) & @CRLF ) Local $AWD_REATA = "[ACTIVE; REGEXPTITLE:" & $Title & "; REGEXPCLASS:" & $Class & "]" ConsoleWrite( "REATA Property: '" & $AWD_REATA & "'" & @CRLF ) ConsoleWrite( "REATA Match: " & WinExists( $AWD_REATA ) & @CRLF ) EndFunc AutoItVersion: 3.3.16.1 Active Window Title match string: 'SciTE' Active Window Class match string: 'SciTEWindow' RETitle Property: '[REGEXPTITLE:SciTE]' RETitle Match: 1 REClass Property: '[REGEXPCLASS:SciTEWindow]' REClass Match: 1 RETC Property: '[REGEXPTITLE:SciTE; REGEXPCLASS:SciTEWindow]' RETC Match: 1 RETC Property: '[REGEXPTITLE:SciTE; REGEXPCLASS:XXXX]' RETC Match: 0 RETA Property: '[REGEXPTITLE:XXXX; ACTIVE]' RETA Match: 1 RETCA Property: '[REGEXPTITLE:XXXX; REGEXPCLASS:XXXX; ACTIVE]' RETCA Match: 1 REATA Property: '[ACTIVE; REGEXPTITLE:XXXX; REGEXPCLASS:XXXX]' REATA Match: 1
-
After an upgrade to 3.3.16.1, using the options listed below, the Registry key that stores the "User Include Folder" (HKEY_CURRENT_USER\SOFTWARE\AutoIt v3\AutoIt) is gone and I have to use Tools -> SciTE Config to set it back to the original value. All my other AutoIt and SciTE options/setting were left unchanged. Before Upgrade: "HKEY_CURRENT_USER\SOFTWARE\AutoIt v3" had a subkey "AutoIt" with a REG_SZ value of "Include" which was my "User Include Folder" path. Reg Export: [HKEY_CURRENT_USER\SOFTWARE\AutoIt v3\AutoIt] "Include"="C:\\HotRod\\AU3\\_INC" After Upgrade: There is no "AutoIt" subkey under "HKEY_CURRENT_USER\SOFTWARE\AutoIt v3" and the "User Include Folder" field in SciTE Config is blank. Upgrade Options: Uninstall before continuing Use native x64 tools by default Default for *.au3 files = Edit the script Type of install: Full Destination Folder: C:\Progs\Apps\AutoIt
-
With #Au3Stripper_Parameters=/ShowConsoleInfo=0 - Why does Au3Stripper output Iteration information lines to the console? And why is it prefixed with a hyphen (which makes it show as Orange)? I don't understand how this info is helpful (if there were no errors) . And in any case, why is it prefixed with a hyphen, which I thought was usually used for warning? I was reticent about making this post because I've searched the forum and I don't see anyone else complaining about this. Which usually means I've missed something obvious to everyone else.
-
The SciTEConfig doc page says "Set the size of the lower console pane on SciTE start". But I can not find that on any of the SciTEConfig Options panels. I was able to make the changes I needed using the "output.horizontal.size" and "output.vertical.size" settings in my SciTEUser.properties file. But it might save the next person some frustration if either the SciTEConfig doc page is updated or the option is added to one of the Options panels. If I am blind and/or stupid and the option is there someplace, please accept my appologies.
-
Water, No disrespect of any kind intended towards OutlookEX UDF. I have used it in the past to do common Outlook automation task. But this time I'm way off in the weeds. I am trying to run an Outlook VBA module Public Sub (aka macro) from an AutoIt script. I wanted something very simple to start from so I could add my steps one at a time and be able to see the impact.
-
Colyn1337 Thanks! Your very simple code here, for creating a new Outlook Mail Item was just what I needed to get me started. I looked at the OutlookEX UDF. It seems very well thought out, but it's way too complicated for someone who just wants a simple example and something they can quickly understand and expand on.
-
Melba23's code is remarkable to someone as dumb as me. But it works like a champ. I looked at a number of Send Key techniques but I really don't like doing things that way when there is another way. Thank you Melba23. Nice piece of code! Here's what you get when you pass Melba23's _ExplorerWinGetSelectedItems function the handle to a Windows Explorer window. The directory is the first element of the array and any selected items follow.
-
Old thread, but very helpful. And still relevant. I can confirm, that for IE11 on Win7, the PID you get back from a RUN of IE is NOT the PID associated with the new window that opens. Doesn't matter if IE is running already or not. Ascend4nt's idea of opening the new IE window Hidden and then looking for the only Hidden IE Window is clever. I'll try a similar approach.
-
Just want to say "Thank You wraithdu!". Well done! I needed something that would return the current Master Volume Mute Status, and your UDF is perfect. I was almost going to code it in (another scripting language that starts with "Auto" but shall remain nameless) because it has a built-in "SoundGet, master_mute" function. You have saved me from having to deal with the Devil.
-
M4Au3 - M4 Based Macro Preprocessor for AutoIt
AGlassman replied to AGlassman's topic in AutoIt Example Scripts
Update on my continuing search for an AutoIt preprocessor. I have given up on M4. I got as far as doing some simple AutoIt style macros. But as Michael Breen states on http://mbreen.com/m4.html "While m4's textual rescanning approach is conceptually elegant, it can be confusing in practice and demands careful attention to layers of nested quotes". It is just too much work doing M4 macros that consistently work correctly and fit into the AutoIt programming style. Filepp http://freecode.com/projects/filepp a generic Perl-based file preprocessor looked promising. But it lacks essential customization abilities, and the existing code is not easy to modify or maintain. I am currently evaluating GPP http://en.nothingisreal.com/wiki/GPP a general-purpose preprocessor with customizable syntax. I would welcome any input about other attempts to create an AutoIt preprocessor and the tools involved.- 3 replies
-
- Macro
- Preprocessor
-
(and 2 more)
Tagged with:
-
GreenShot Screen Capture Automation
AGlassman replied to AGlassman's topic in AutoIt Example Scripts
I use a large number of utilities in the course of a day's work. Some, like GreenShot, only rarely and I don't want them running all the time. I realize that GreenShot takes almost no resoruces when it's idle, but I prefer to keep the number of active processes (and tray icons) to a minimum. -
I have been searching for a general purpose AutoIt macro preprocessor for some time. I've looked at all the existing implementations I could find, and researched two in detail: Shaggi's implementation of the C Preprocessor "mcpp" () kjactive's Au3PreProcessor (). But none of these are general enough in scope, or powerful enough in their macro expansion capabilities, to allow the rapid development of domain specific commands or the encapsulation of complex AutoIt constructs that I'm looking for. So, I am currently building a prototype AutoIt preprocessor (tentatively named "M4Au3") based on the GNU M4 macro processor (http://www.gnu.org/software/m4/). My goal is to provide a well defined set of built-in macros that extend the existing AutoIt "@Macro" syntax (but accept arguments) and to allow user defined macros in the same style, e.g. "@MyMacro( Arg1, Arg2 )". If anyone has already tried this approach, or something similar to it, I would be very interested in your results and suggestions.
- 3 replies
-
- Macro
- Preprocessor
-
(and 2 more)
Tagged with:
-
GreenShot (http://getgreenshot.org/) is a nice, free for personal use, screen capture utility. It is designed to be running all the time (in the system notification tray) and triggered with a Global Hotkey (Print Scrn). I prefer to only run it when I need it and have it exit when I'm done, so I wrote this simple script. It starts the utility (if it's not already running), triggers a capture operation, waits for me to finish editing/saving the image, and then closes the utility. The only tricky part was determining when it was ready to accept a HotKey to start the capture. My solution was to monitor it's IO count. The only downside is that it leaves the tray icon visable until the next tray refresh, because I killed it instead of closing it down normally. (Known problem). - Alan G - GreenShot_Auto_X86_V1.0.zip ; ===================================================================== ; Start GreenShot ; Send it a PrintScreen keyboard commnad ; Wait for a capture ; Shut it down ; ===================================================================== Global $ProcessName = "Greenshot.exe" ; Process Name Global $WindowTitle = "Greenshot image editor" ; Image Editor Window Title Global $RunCmd = "C:\Program Files (x86)\Greenshot\Greenshot.exe" ; Program run Command Global $WorkingDir = "" ; Working Directory ; If GreenShot is not already running If NOT ProcessExists( $ProcessName ) Then ; Execute GreenShot If NOT ShellExecute( $RunCmd, "", $WorkingDir ) Then MsgBox( 16, @ScriptFullPath & " - Error", _ "Program failed to execute. $RunCmd = '" & $RunCmd & "'." ) Exit( 1 ) Else ; Wait for the GreenShot process to exist If NOT ProcessWait( $ProcessName, 5 ) Then MsgBox( 16, @ScriptFullPath & " - Error", _ "Process did not start. $ProcessName = '" & $ProcessName & "'." ) Exit( 1 ) Else ; Wait for a minimum number of IO (So we know it's ready) Global $Ready = False For $i = 1 To 20 Global $IOStats = ProcessGetStats( $ProcessName, 1 ) If $IOStats[1] > 4 Then $Ready = True ExitLoop EndIf Sleep( 250 ) Next ; $i If NOT $Ready Then MsgBox( 16, @ScriptFullPath & " - Error", _ "Process IO Reads not > 700. $ProcessName = '" & $ProcessName & "', $IOStats[1] = '" & $IOStats[1] & "'." ) Exit( 1 ) EndIf EndIf ; NOT ProcessWait EndIf ; NOT ShellExecute EndIf ; NOT ProcessExists ; Send GreenShot a PrintScreen Keyboard command to ; initiate a Capture Send( "{PRINTSCREEN}" ) ; Wait for the Greenshot Image Editor Window to Open ; after I take a shot If NOT WinWaitActive( $WindowTitle, "", 300 ) Then MsgBox( 16, @ScriptFullPath & " - Error", _ "Image Editor Window did not open. $WindowTitle = '" & $WindowTitle & "'." ) Exit( 1 ) EndIf ; Wait for the Greenshot Image Editor Window to Close ; then kill the process WinWaitClose( $WindowTitle ) ProcessClose( $ProcessName ) If NOT ProcessWaitClose( $ProcessName, 5 ) Then MsgBox( 16, @ScriptFullPath & " - Error", _ "Process failed to close. $ProcessName = '" & $ProcessName & "'." ) Exit( 1 ) EndIf ; All done Exit( 0 )
-
NVidia Apply Desktop Settings after reboot
AGlassman replied to AGlassman's topic in AutoIt Example Scripts
prbatman The method for finding the number of monitors was based on looking for specific pixels (the small green bar in the bottom left of the display icons), and it never worked as well as I would have liked. I have problems with it myself, but I need it because I have multiple monitors. I have posted a new ZIP (NVidia_ApplyDesktopSettings_V1.3.zip) that has a seperate version of the code that only works for a single monitor, but does not have the pixel seatch problem. Please let me know if the Single Monitor version works for you. -
The NVidia Control Panel under Windows 7 and Vista sometimes does not apply the saved Desktop Color Settings after a reboot. (See NVidia Forum Post). This script runs the NVidia Control Panel and toggles the Choose how color is set value from NVidia to Other and back again. This causes the saved NVidia settings to be applied. 2011-08-25 - v1.1 Added support for multiple monitors. 2011-08-30 - v1.2 Added retry loop to multiple monitor detect. 2011-10-03 - v1.3 Added Single Monitor Only version. 2011-10-14 - v1.4 Improved multiple monitor detection NVidia_ApplyDesktopSettings_V1.4.zip
-
Does anyone know of a native AutoIt implementation of Patricia Radix Trees (http://en.wikipedia.org/wiki/Radix_tree)? Or an external implementation that could be interfaced to AutoIt? A search of the forums turns up nothing. I need an in-memory data structure that can search a large number of long strings that have a (relativly) small number of common prefixes. Insert/Delete times are not that critical for this project, only search speed and memory usage. While there are many versions of associative arrays that might do what I need, none seem to have the combination of speed and compactness that a Patricia Tree might offer. I have started work on my own design, but I certainly don't want to re-invent the wheel.