Hash arrays ("associative arrays" / "dictionaries") for PowerBuilder

One thing I miss in PowerBuilder development is something like a hash array.

Are there any good* implementations/solutions out for PB?
(I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)

*good means for me:
- no special runtime requirements like additional OLE components or 
special Windows components (like the .NET framework)
- it shouldn't have much overhead


Is there a PBNI implementation?
0
JKorth
3/26/2008 9:46:44 AM
sybase.powerbuilder.general 62418 articles. 17 followers. Follow

17 Replies
1796 Views

Similar Articles

[PageSpeed] 22

Hi JKorth,

it should not be that hard to implement using datastore.
Have you checked pfc if it contains what you need ?

Regards

JKorth pisze:
> One thing I miss in PowerBuilder development is something like a hash 
> array.
> 
> Are there any good* implementations/solutions out for PB?
> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
> 
> *good means for me:
> - no special runtime requirements like additional OLE components or 
> special Windows components (like the .NET framework)
> - it shouldn't have much overhead
> 
> 
> Is there a PBNI implementation?
0
fisher
3/26/2008 11:39:11 AM
PFC (http://pfc.codexchange.sybase.com) has linked list
implementations, which can be extended to hash lists (node.key is
name, node.data is value). I've done it, but I find it's not a very
good performer. 

Good luck,

Terry [TeamSybase] and Sequel the techno-kitten

On 26 Mar 2008 03:39:11 -0800, fisher
<fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:

>Hi JKorth,
>
>it should not be that hard to implement using datastore.
>Have you checked pfc if it contains what you need ?
>
>Regards
>
>JKorth pisze:
>> One thing I miss in PowerBuilder development is something like a hash 
>> array.
>> 
>> Are there any good* implementations/solutions out for PB?
>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>> 
>> *good means for me:
>> - no special runtime requirements like additional OLE components or 
>> special Windows components (like the .NET framework)
>> - it shouldn't have much overhead
>> 
>> 
>> Is there a PBNI implementation?

*********************************
Build your vocabulary while feeding the hungry
http://www.freerice.com
*********************************
Newsgroup User Manual
=====================
TeamSybase <> Sybase employee
Forums = Peer-to-peer
Forums <> Communication with Sybase
IsNull (AnswerTo (Posting)) can return TRUE
Forums.Moderated = TRUE, so behave or be deleted
*********************************

Sequel's Sandbox: http://www.techno-kitten.com
Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. 
Version 4.0.3 now available at the Sandbox
PB Futures updated Feb 22/2008
See the PB Troubleshooting & Migration Guides at the Sandbox
^ ^
o o
=*=
0
Terry
3/26/2008 11:49:58 AM
Isn't this what a database is good at ?

Or are you looking for something lighter weight (or for only a few
entries...)

Regards,
Reed Shilts
<Standard-Disclaimers-Apply/>

On 26 Mar 2008 01:46:44 -0800, JKorth <nooospaaam_jk@epos-gmbh.de>
wrote:

>One thing I miss in PowerBuilder development is something like a hash array.
>
>Are there any good* implementations/solutions out for PB?
>(I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>
>*good means for me:
>- no special runtime requirements like additional OLE components or 
>special Windows components (like the .NET framework)
>- it shouldn't have much overhead
>
>
>Is there a PBNI implementation?

0
Reed
3/26/2008 12:44:18 PM
Reed Shilts [Sybase] schrieb:
> Isn't this what a database is good at ?
Hm - I use the database only for permanent storage.
> 
> Or are you looking for something lighter weight (or for only a few
> entries...)
Yes - lightweight but not limited
(I think of something like the hash arrays in PHP and Perl which are THE 
data structure for all uses - highly optimized like nothing else)
0
JKorth
3/26/2008 1:01:33 PM
I agree. An external DataWindow and a datastore should provide this
functionality. 

Regards,
Dave Fish
Sybase

PowerBuilder Blog:
http://powerbuilderevangelist.blogspot.com/

On 26 Mar 2008 03:39:11 -0800, fisher
<fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:

>Hi JKorth,
>
>it should not be that hard to implement using datastore.
>Have you checked pfc if it contains what you need ?
>
>Regards
>
>JKorth pisze:
>> One thing I miss in PowerBuilder development is something like a hash 
>> array.
>> 
>> Are there any good* implementations/solutions out for PB?
>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>> 
>> *good means for me:
>> - no special runtime requirements like additional OLE components or 
>> special Windows components (like the .NET framework)
>> - it shouldn't have much overhead
>> 
>> 
>> Is there a PBNI implementation?
0
Dave
3/26/2008 1:23:53 PM
A DataWindow approach is OK for scalar values, but won't help for any 
complex data types, like window handles or NVOs.

We need something native that performs better than the PowerScript 
implementations. <hint, hint>

Just my two cents,

Terry [TeamSybase] and Sequel the techno-kitten

Dave Fish [TeamSybase] wrote:
> I agree. An external DataWindow and a datastore should provide this
> functionality. 
> 
> Regards,
> Dave Fish
> Sybase
> 
> PowerBuilder Blog:
> http://powerbuilderevangelist.blogspot.com/
> 
> On 26 Mar 2008 03:39:11 -0800, fisher
> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:
> 
>> Hi JKorth,
>>
>> it should not be that hard to implement using datastore.
>> Have you checked pfc if it contains what you need ?
>>
>> Regards
>>
>> JKorth pisze:
>>> One thing I miss in PowerBuilder development is something like a hash 
>>> array.
>>>
>>> Are there any good* implementations/solutions out for PB?
>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>
>>> *good means for me:
>>> - no special runtime requirements like additional OLE components or 
>>> special Windows components (like the .NET framework)
>>> - it shouldn't have much overhead
>>>
>>>
>>> Is there a PBNI implementation?


-- 
*********************************
Build your vocabulary and feed the hungry
http://www.freerice.com
*********************************
Newsgroup User Manual
=====================
TeamSybase <> Sybase employee
Forums = Peer-to-peer
Forums <> Communication with Sybase
IsNull (AnswerTo (Posting)) can return TRUE
Forums.Moderated = TRUE, so behave or be deleted
*********************************

Sequel's Sandbox: http://www.techno-kitten.com
Home of PBL Peeper, a free PowerBuilder Developer's Toolkit.
Version 4.0.3 now available at the Sandbox
PB Futures updated Feb 22/2008
See the PB Troubleshooting & Migration Guides at the Sandbox
^ ^
o o
=*=
0
Terry
3/26/2008 1:59:56 PM
I don't see this type of functionality being added to native
PowerBuilder PowerScript. You can do it in a .NET target and
PowerBuilder 12 will offer language enhancements for WPF Targets. 

Regards,
Dave Fish
Sybase

PowerBuilder Blog:
http://powerbuilderevangelist.blogspot.com/

On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]"
<sequel@techno-kitten.com> wrote:

>A DataWindow approach is OK for scalar values, but won't help for any 
>complex data types, like window handles or NVOs.
>
>We need something native that performs better than the PowerScript 
>implementations. <hint, hint>
>
>Just my two cents,
>
>Terry [TeamSybase] and Sequel the techno-kitten
>
>Dave Fish [TeamSybase] wrote:
>> I agree. An external DataWindow and a datastore should provide this
>> functionality. 
>> 
>> Regards,
>> Dave Fish
>> Sybase
>> 
>> PowerBuilder Blog:
>> http://powerbuilderevangelist.blogspot.com/
>> 
>> On 26 Mar 2008 03:39:11 -0800, fisher
>> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:
>> 
>>> Hi JKorth,
>>>
>>> it should not be that hard to implement using datastore.
>>> Have you checked pfc if it contains what you need ?
>>>
>>> Regards
>>>
>>> JKorth pisze:
>>>> One thing I miss in PowerBuilder development is something like a hash 
>>>> array.
>>>>
>>>> Are there any good* implementations/solutions out for PB?
>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>
>>>> *good means for me:
>>>> - no special runtime requirements like additional OLE components or 
>>>> special Windows components (like the .NET framework)
>>>> - it shouldn't have much overhead
>>>>
>>>>
>>>> Is there a PBNI implementation?
0
Dave
3/26/2008 2:08:35 PM
Here is an old implementation by Michael Ogrinz

"JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message 
news:47ea1b84$1@forums-1-dub...
> One thing I miss in PowerBuilder development is something like a hash 
> array.
>
> Are there any good* implementations/solutions out for PB?
> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>
> *good means for me:
> - no special runtime requirements like additional OLE components or
> special Windows components (like the .NET framework)
> - it shouldn't have much overhead
>
>
> Is there a PBNI implementation? 


begin 666 associative_array.zip
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
M```&````````````( ```!]%``!!02Y00DQ02P4&``````8`!@!L`0``#E,`
#````
`
end

0
Philip
3/26/2008 4:46:09 PM
This is a multi-part message in MIME format.
--------------020003060200010203070608
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

And here's an implementation that I threw together recently. I'll have 
to review Mr. Ogrinz's version to see how I can improve mine.

Philip Salgannik wrote:
> Here is an old implementation by Michael Ogrinz
> 
> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message 
> news:47ea1b84$1@forums-1-dub...
>> One thing I miss in PowerBuilder development is something like a hash 
>> array.
>>
>> Are there any good* implementations/solutions out for PB?
>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>
>> *good means for me:
>> - no special runtime requirements like additional OLE components or
>> special Windows components (like the .NET framework)
>> - it shouldn't have much overhead
>>
>>
>> Is there a PBNI implementation? 
> 
> 


--------------020003060200010203070608
Content-Type: application/x-zip-compressed;
 name="_hashtable.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="_hashtable.zip"

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
--------------020003060200010203070608--
0
Jason
3/26/2008 5:05:37 PM
This is a multi-part message in MIME format.
--------------060201040706020400060704
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

An array of names and an array of objects....
Can't you guys do any better than that?

The slowest part of this object is the hash function. Replace that with 
an external dll call of some kind and it will be fast enough to store a 
few thousand objects without being a bottleneck.

I have a dll somewhere that does MD5 hashes that I use myself, but the 
code isn't very portable.

Jason 'Bug' Fenter [TeamSybase] wrote:
> And here's an implementation that I threw together recently. I'll have 
> to review Mr. Ogrinz's version to see how I can improve mine.
> 
> Philip Salgannik wrote:
>> Here is an old implementation by Michael Ogrinz
>>
>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message 
>> news:47ea1b84$1@forums-1-dub...
>>> One thing I miss in PowerBuilder development is something like a hash 
>>> array.
>>>
>>> Are there any good* implementations/solutions out for PB?
>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>
>>> *good means for me:
>>> - no special runtime requirements like additional OLE components or
>>> special Windows components (like the .NET framework)
>>> - it shouldn't have much overhead
>>>
>>>
>>> Is there a PBNI implementation? 
>>
>>
> 


--------------060201040706020400060704
Content-Type: text/plain;
 name="n_cst_hash_table.sru"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="n_cst_hash_table.sru"

//4kAFAAQgBFAHgAcABvAHIAdABIAGUAYQBkAGUAcgAkAG4AXwBjAHMAdABfAGgAYQBzAGgA
XwB0AGEAYgBsAGUALgBzAHIAdQANAAoAJABQAEIARQB4AHAAbwByAHQAQwBvAG0AbQBlAG4A
dABzACQAZQBjAHMALgBwAGIAbAAgAC0AIABOAEUAVwANAAoAZgBvAHIAdwBhAHIAZAANAAoA
ZwBsAG8AYgBhAGwAIAB0AHkAcABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwA
ZQAgAGYAcgBvAG0AIABuAG8AbgB2AGkAcwB1AGEAbABvAGIAagBlAGMAdAANAAoAZQBuAGQA
IAB0AHkAcABlAA0ACgB0AHkAcABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQA
IABmAHIAbwBtACAAbgBvAG4AdgBpAHMAdQBhAGwAbwBiAGoAZQBjAHQAIAB3AGkAdABoAGkA
bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwB0AGEAYgBsAGUADQAKAGUAbgBkACAAdAB5AHAA
ZQANAAoAZQBuAGQAIABmAG8AcgB3AGEAcgBkAA0ACgANAAoAZwBsAG8AYgBhAGwAIAB0AHkA
cABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwAZQAgAGYAcgBvAG0AIABvAGwA
ZQBvAGIAagBlAGMAdAANAAoAZQB2AGUAbgB0ACAAdQBlAF8AZABvAGMAdQBtAGUAbgB0AGEA
dABpAG8AbgAgACgAIAApAA0ACgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAAgAG4A
XwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0AA0ACgBlAG4AZAAgAHQAeQBwAGUADQAKAGcA
bABvAGIAYQBsACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwAZQAgAG4AXwBjAHMA
dABfAGgAYQBzAGgAXwB0AGEAYgBsAGUADQAKAA0ACgB0AHkAcABlACAAdgBhAHIAaQBhAGIA
bABlAHMADQAKAHAAcgBpAHYAYQB0AGUAOgANAAoAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwA
aQBzAHQAIABpAG4AXwBiAHUAYwBrAGUAdABzAFsAXQAsACAAaQBuAF8AZQBtAHAAdAB5AA0A
CgANAAoAdQBuAHMAaQBnAG4AZQBkAGwAbwBuAGcAIABpAGwAXwBzAHAAbABpAHQAXwBwAHQA
cgAsACAAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAPQAxACwAIABpAGwAXwBrAGUAeQBfAGMA
bwB1AG4AdAANAAoAZQBuAGQAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoADQAKAGYAbwByAHcA
YQByAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIA
cgBvAHUAdABpAG4AZQAgAG8AZgBfAHQAaAByAG8AdwAoAHMAdAByAGkAbgBnACAAYQBzAF8A
ZQByAHIAbwByACkADQAKAHAAcgBpAHYAYQB0AGUAIABmAHUAbgBjAHQAaQBvAG4AIABsAG8A
bgBnACAAbwBmAF8AaABhAHMAaAAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBzAHQAcgBpAG4A
ZwApAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIAcgBvAHUAdABpAG4AZQAgAG8AZgBfAHMA
cABsAGkAdABfAGIAdQBjAGsAZQB0ACAAKAApAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIA
cgBvAHUAdABpAG4AZQAgAG8AZgBfAG0AZQByAGcAZQBfAGIAdQBjAGsAZQB0ACAAKAApAA0A
CgBwAHUAYgBsAGkAYwAgAHMAdQBiAHIAbwB1AHQAaQBuAGUAIABvAGYAXwByAGUAbQBvAHYA
ZQAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBrAGUAeQApACAAdABoAHIAbwB3AHMAIABlAHgA
YwBlAHAAdABpAG8AbgANAAoAcAByAGkAdgBhAHQAZQAgAGYAdQBuAGMAdABpAG8AbgAgAGwA
bwBuAGcAIABvAGYAXwBiAHUAYwBrAGUAdABfAG8AZgBmAHMAZQB0ACAAKABsAG8AbgBnACAA
YQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGwAbwBuAGcAIABhAGwAXwBzAHAAbABpAHQA
XwBwAHQAcgAsACAAdQBuAHMAaQBnAG4AZQBkAGwAbwBuAGcAIABhAGwAXwBoAGEAcwBoAF8A
dgBhAGwAKQANAAoAcAB1AGIAbABpAGMAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8A
YQBkAGQAIAAoAHMAdAByAGkAbgBnACAAYQBzAF8AbgBhAG0AZQAsACAAYQBuAHkAIABhAGEA
XwB2AGEAbAB1AGUALAAgAGIAbwBvAGwAZQBhAG4AIABhAGIAXwBmAGEAaQBsAF8AZQB4AGkA
cwB0AHMAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQAaQBvAG4ADQAKAHAAdQBiAGwA
aQBjACAAZgB1AG4AYwB0AGkAbwBuACAAYgBvAG8AbABlAGEAbgAgAG8AZgBfAGcAZQB0ACAA
KABzAHQAcgBpAG4AZwAgAGEAcwBfAGsAZQB5ACwAIAByAGUAZgAgAGEAbgB5ACAAYQBhAF8A
cgBlAHQAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQAaQBvAG4ADQAKAHAAdQBiAGwA
aQBjACAAcwB1AGIAcgBvAHUAdABpAG4AZQAgAG8AZgBfAGMAbABlAGEAbgBfAHUAcAAgACgA
KQANAAoAZQBuAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgANAAoAZQB2AGUAbgB0ACAA
dQBlAF8AZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAoACkAOwAvAC8AIABwAG8AcgB0AGUA
ZAAgAHQAaABpAHMAIABoAGEAcwBoACAAaQBtAHAAbABlAG0AZQBuAHQAYQB0AGkAbwBuACAA
dABvACAAUABCACAAZgByAG8AbQAgAGEAbgAgAGUAeABhAG0AcABsAGUAIABmAG8AdQBuAGQA
IABvAG4AIAB0AGgAZQAgAG4AZQB0AA0ACgANAAoALwAvACAAYQBuACAAZQBsAGUAbQBlAG4A
dAAgAGkAcwAgAGYAbwB1AG4AZAAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlACAAYgB5ACAA
dQBzAGkAbgBnACAAbQBvAGQAKABoAGEAcwBoACwAIABuACkAIAB3AGgAZQByAGUAIABuACAA
aQBzACAAYQAgAHAAbwB3AGUAcgAgAG8AZgAgADIADQAKAC8ALwAgAGEAcwAgAHQAaABlACAA
dABhAGIAbABlACAAZQB4AHAAYQBuAGQAcwAgAG4AIAB3AGkAbABsACAAZABvAHUAYgBsAGUA
DQAKAC8ALwAgAHQAbwAgAHIAZQBkAHUAYwBlACAAdABoAGUAIAB3AG8AcgBrACAAbwBmACAA
ZQB4AHAAYQBuAGQAaQBuAGcAIAB0AGgAZQAgAHQAYQBiAGwAZQAsACAAbwBuAGUAIABoAGEA
cwBoACAAYgB1AGMAawBlAHQAIAB3AGkAbABsACAAYgBlACAAcwBwAGwAaQB0ACAAYQB0ACAA
YQAgAHQAaQBtAGUADQAKAC8ALwAgAGEAbgBkACAAYgBvAHQAaAAgAGgAYQBzAGgAIAB0AGEA
YgBsAGUAIABzAGkAegBlAHMAIAB3AGkAbABsACAAYwBvAGUAeABpAHMAdAAuAA0ACgANAAoA
LwAvACAAZgBvAHIAIABlAHgAYQBtAHAAbABlADoADQAKAC8ALwAgAFsAMAAgADEAIAAyACAA
MwBdACAANAAgADUAXQANAAoALwAvACAAYgB1AGMAawBlAHQAcwAgADYAIABhAG4AZAAgADcA
IABkAG8AbgAnAHQAIAB5AGUAdAAgAGUAeABpAHMAdAANAAoALwAvACAAdABoAGUAIAB2AGEA
bAB1AGUAcwAgAGMAYQBuACAAYwB1AHIAcgBlAG4AdABsAHkAIABiAGUAIABmAG8AdQBuAGQA
IABpAG4AIABiAHUAYwBrAGUAdABzACAAMgAgAGEAbgBkACAAMwAgAHUAcwBpAG4AZwAgAG0A
bwBkACgALAA0ACkAIABpAG4AcwB0AGUAYQBkACAAbwBmACAAbQBvAGQAKAAsADgAKQANAAoA
LwAvACAAaQBmACAAdwBlACAAYQBkAGQAIABhAG4AbwB0AGgAZQByACAAZQBsAGUAbQBlAG4A
dAAsACAAdABoAGUAIABiAHUAYwBrAGUAdAAgAGEAdAAgADIAIAB3AGkAbABsACAAYgBlACAA
cwBwAGwAaQB0ACAAaQBuAHQAbwAgAG0AbwBkACgAaABhAHMAaAAsADgAKQA9ADIAIABhAG4A
ZAAgAG0AbwBkACgAaABhAHMAaAAsADgAKQA9ADYADQAKAC8ALwAgAGkAZgAgAGEAbgAgAGUA
bABlAG0AZQBuAHQAIAB3AGEAcwAgAHIAZQBtAG8AdgBlAGQALAAgAHQAaABlACAAMgAgAGIA
dQBjAGsAZQB0AHMAIAAyACAAYQBuAGQAIAA2ACAAdwBvAHUAbABkACAAYgBlACAAcgBlAGMA
bwBtAGIAaQBuAGUAZAAgAGEAZwBhAGkAbgAuAA0ACgBlAG4AZAAgAGUAdgBlAG4AdAANAAoA
DQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8AdABoAHIA
bwB3ACgAcwB0AHIAaQBuAGcAIABhAHMAXwBlAHIAcgBvAHIAKQAgAHQAaAByAG8AdwBzACAA
ZQB4AGMAZQBwAHQAaQBvAG4AOwBlAHgAYwBlAHAAdABpAG8AbgAgAGUADQAKAGUAPQBjAHIA
ZQBhAHQAZQAgAGUAeABjAGUAcAB0AGkAbwBuAA0ACgBlAC4AcwBlAHQAbQBlAHMAcwBhAGcA
ZQAoAGEAcwBfAGUAcgByAG8AcgApAA0ACgB0AGgAcgBvAHcAIABlAA0ACgBlAG4AZAAgAHMA
dQBiAHIAbwB1AHQAaQBuAGUADQAKAA0ACgBwAHIAaQB2AGEAdABlACAAZgB1AG4AYwB0AGkA
bwBuACAAbABvAG4AZwAgAG8AZgBfAGgAYQBzAGgAIAAoAHMAdAByAGkAbgBnACAAYQBzAF8A
cwB0AHIAaQBuAGcAKQA7AA0ACgBjAGgAYQByAGEAYwB0AGUAcgAgAGwAYwBfAHYAYQBsAHUA
ZQBzAFsAXQANAAoAbABvAG4AZwAgAGwAbABfAGkADQAKAHUAbgBzAGkAZwBuAGUAZABsAG8A
bgBnACAAbABsAF8AcgBlAHQADQAKAA0ACgBsAGMAXwB2AGEAbAB1AGUAcwA9AGEAcwBfAHMA
dAByAGkAbgBnAA0ACgBmAG8AcgAgAGwAbABfAGkAIAA9ACAAMQAgAHQAbwAgAGwAZQBuACgA
YQBzAF8AcwB0AHIAaQBuAGcAKQANAAoACQBsAGwAXwByAGUAdAArAD0AYQBzAGMAKABsAGMA
XwB2AGEAbAB1AGUAcwBbAGwAbABfAGkAXQApACsANAA4ADUAMwAxADgADQAKAAkAbABsAF8A
cgBlAHQAKgA9ADIANgA1ADQANAAzADUANwA2ADEADQAKAG4AZQB4AHQADQAKAA0ACgByAGUA
dAB1AHIAbgAgAGwAbABfAHIAZQB0AA0ACgBlAG4AZAAgAGYAdQBuAGMAdABpAG8AbgANAAoA
DQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8AcwBwAGwA
aQB0AF8AYgB1AGMAawBlAHQAIAAoACkAOwBsAG8AbgBnACAAbABsAF8AbwBsAGQAXwBwAGwA
YQBjAGUALAAgAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACwAIABsAGwAXwBpAA0ACgBuAF8A
YwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAAgAGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuACwA
IABsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAsACAAbABuAF8AYwB1AHIAXwBwAHQAcgAsACAA
bABuAF8AbgBlAHgAdABfAHAAdAByAA0ACgANAAoAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUA
PQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgANAAoAbABsAF8AbgBlAHcAXwBwAGwAYQBjAGUA
PQBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQArAGkAbABfAG0AYQB4AF8AcwBwAGwAaQB0AA0A
CgANAAoAaQBmACAAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAKwAxACAAPgA9ACAAaQBsAF8A
bQBhAHgAXwBzAHAAbABpAHQAIAB0AGgAZQBuAA0ACgAJAGkAZgAgAGkAbABfAGsAZQB5AF8A
YwBvAHUAbgB0ACAAPAAgADIAIAB0AGgAZQBuACAAcgBlAHQAdQByAG4ADQAKAAkADQAKAAkA
aQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAIAArAD0AIABpAGwAXwBtAGEAeABfAHMAcABsAGkA
dAANAAoACQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgA9ADAADQAKAGUAbABzAGUADQAKAAkA
aQBsAF8AcwBwAGwAaQB0AF8AcAB0AHIAPQBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQArADEA
DQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8AYwB1AHIAXwBwAHQAcgA9AGkAbgBfAGIA
dQBjAGsAZQB0AHMAWwBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQAgACsAMQBdAA0ACgANAAoA
ZABvACAAdwBoAGkAbABlACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAGMAdQByAF8AcAB0AHIA
KQANAAoACQBsAG4AXwBuAGUAeAB0AF8AcAB0AHIAPQBsAG4AXwBjAHUAcgBfAHAAdAByAC4A
aQBuAF8AbgBlAHgAdAANAAoACQANAAoACQBpAGYAIABvAGYAXwBiAHUAYwBrAGUAdABfAG8A
ZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkA
dABfAHAAdAByACwAIABsAG4AXwBjAHUAcgBfAHAAdAByAC4AaQBsAF8AaABhAHMAaAApAD0A
bABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAIAB0AGgAZQBuAA0ACgAJAAkAbABuAF8AYwB1AHIA
XwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgANAAoA
CQAJAGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuAD0AbABuAF8AYwB1AHIAXwBwAHQAcgANAAoA
CQBlAGwAcwBlAA0ACgAJAAkAbABuAF8AYwB1AHIAXwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQA
PQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgANAAoACQAJAGwAbgBfAG4AZQB3AF8AYwBoAGEA
aQBuAD0AbABuAF8AYwB1AHIAXwBwAHQAcgANAAoACQBlAG4AZAAgAGkAZgANAAoACQANAAoA
CQBsAG4AXwBjAHUAcgBfAHAAdAByAD0AbABuAF8AbgBlAHgAdABfAHAAdAByAA0ACgBsAG8A
bwBwAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG8AbABkAF8AYwBoAGEA
aQBuACkAIAB0AGgAZQBuAA0ACgAJAGkAbgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBvAGwA
ZABfAHAAbABhAGMAZQAgACsAMQBdAD0AbABuAF8AbwBsAGQAXwBjAGgAYQBpAG4ALgBvAGYA
XwByAGUAdgBlAHIAcwBlACgAKQANAAoAZQBsAHMAZQANAAoACQBpAG4AXwBiAHUAYwBrAGUA
dABzAFsAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAIAArADEAXQA9AGkAbgBfAGUAbQBwAHQA
eQANAAoAZQBuAGQAIABpAGYADQAKAA0ACgBpAGYAIABpAHMAdgBhAGwAaQBkACgAbABuAF8A
bgBlAHcAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4ADQAKAAkAaQBuAF8AYgB1AGMAawBlAHQA
cwBbAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBsAG4AXwBuAGUAdwBfAGMA
aABhAGkAbgAuAG8AZgBfAHIAZQB2AGUAcgBzAGUAKAApAA0ACgBlAGwAcwBlAA0ACgAJAGkA
bgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBuAGUAdwBfAHAAbABhAGMAZQAgACsAMQBdAD0A
aQBuAF8AZQBtAHAAdAB5AA0ACgBlAG4AZAAgAGkAZgANAAoADQAKAGUAbgBkACAAcwB1AGIA
cgBvAHUAdABpAG4AZQANAAoADQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkA
bgBlACAAbwBmAF8AbQBlAHIAZwBlAF8AYgB1AGMAawBlAHQAIAAoACkAOwBsAG8AbgBnACAA
bABsAF8AbgBlAHcAXwBwAGwAYQBjAGUALAAgAGwAbABfAG8AbABkAF8AcABsAGEAYwBlAA0A
CgBiAG8AbwBsAGUAYQBuACAAbABiAF8AdQBzAGUAXwBvAGwAZABfAGMAaABhAGkAbgANAAoA
bgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABsAG4AXwBvAGwAZABfAGMAaABhAGkA
bgAsACAAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4ALAAgAGwAbgBfAG0AZQByAGcAZQBfAGwA
aQBzAHQALAAgAGwAbgBfAHQAbQBwAA0ACgANAAoAaQBmACAAaQBsAF8AcwBwAGwAaQB0AF8A
cAB0AHIAPQAwACAAdABoAGUAbgANAAoACQBpAGYAIABpAGwAXwBrAGUAeQBfAGMAbwB1AG4A
dAA8ADEAIAB0AGgAZQBuACAAcgBlAHQAdQByAG4ADQAKAAkAaQBsAF8AbQBhAHgAXwBzAHAA
bABpAHQAIAA9ACAAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAIAAvACAAMgANAAoACQBpAGwA
XwBzAHAAbABpAHQAXwBwAHQAcgAgAD0AIABpAGwAXwBtAGEAeABfAHMAcABsAGkAdAAgAC0A
MQANAAoAZQBsAHMAZQANAAoACQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgAgAC0ALQANAAoA
ZQBuAGQAIABpAGYADQAKAA0ACgBsAGwAXwBuAGUAdwBfAHAAbABhAGMAZQA9AGkAbABfAHMA
cABsAGkAdABfAHAAdAByAA0ACgBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQA9AGwAbABfAG4A
ZQB3AF8AcABsAGEAYwBlACAAKwAgAGkAbABfAG0AYQB4AF8AcwBwAGwAaQB0AA0ACgANAAoA
bABuAF8AbwBsAGQAXwBjAGgAYQBpAG4APQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8A
bwBsAGQAXwBwAGwAYQBjAGUAIAArADEAXQANAAoAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4A
PQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8AbgBlAHcAXwBwAGwAYQBjAGUAIAArADEA
XQANAAoADQAKAGQAbwAgAHcAaABpAGwAZQAgAGkAcwB2AGEAbABpAGQAKABsAG4AXwBvAGwA
ZABfAGMAaABhAGkAbgApACAAbwByACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG4AZQB3AF8A
YwBoAGEAaQBuACkADQAKAAkAaQBmACAAbgBvAHQAIABpAHMAdgBhAGwAaQBkACgAbABuAF8A
bwBsAGQAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4ADQAKAAkACQBsAGIAXwB1AHMAZQBfAG8A
bABkAF8AYwBoAGEAaQBuAD0AZgBhAGwAcwBlAA0ACgAJAGUAbABzAGUAaQBmACAAbgBvAHQA
IABpAHMAdgBhAGwAaQBkACgAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4A
DQAKAAkACQBsAGIAXwB1AHMAZQBfAG8AbABkAF8AYwBoAGEAaQBuAD0AdAByAHUAZQANAAoA
CQBlAGwAcwBlAA0ACgAJAAkAbABiAF8AdQBzAGUAXwBvAGwAZABfAGMAaABhAGkAbgAgAD0A
IABsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkAcwBfAG4AYQBtAGUAIAA8ACAAbABuAF8A
bgBlAHcAXwBjAGgAYQBpAG4ALgBpAHMAXwBuAGEAbQBlAA0ACgAJAGUAbgBkACAAaQBmAA0A
CgAJAA0ACgAJAGkAZgAgAGwAYgBfAHUAcwBlAF8AbwBsAGQAXwBjAGgAYQBpAG4AIAB0AGgA
ZQBuAA0ACgAJAAkAbABuAF8AdABtAHAAPQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkA
bgBfAG4AZQB4AHQADQAKAAkACQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkAbgBfAG4A
ZQB4AHQAPQBsAG4AXwBtAGUAcgBnAGUAXwBsAGkAcwB0AA0ACgAJAAkAbABuAF8AbQBlAHIA
ZwBlAF8AbABpAHMAdAA9AGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuAA0ACgAJAAkAbABuAF8A
bwBsAGQAXwBjAGgAYQBpAG4APQBsAG4AXwB0AG0AcAANAAoACQBlAGwAcwBlAA0ACgAJAAkA
bABuAF8AdABtAHAAPQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAuAGkAbgBfAG4AZQB4AHQA
DQAKAAkACQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAuAGkAbgBfAG4AZQB4AHQAPQBsAG4A
XwBtAGUAcgBnAGUAXwBsAGkAcwB0AA0ACgAJAAkAbABuAF8AbQBlAHIAZwBlAF8AbABpAHMA
dAA9AGwAbgBfAG4AZQB3AF8AYwBoAGEAaQBuAA0ACgAJAAkAbABuAF8AbgBlAHcAXwBjAGgA
YQBpAG4APQBsAG4AXwB0AG0AcAANAAoACQBlAG4AZAAgAGkAZgANAAoACQAJAA0ACgBsAG8A
bwBwAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG0AZQByAGcAZQBfAGwA
aQBzAHQAKQAgAHQAaABlAG4ADQAKAAkAaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAG4A
ZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBsAG4AXwBtAGUAcgBnAGUAXwBsAGkAcwB0AC4A
bwBmAF8AcgBlAHYAZQByAHMAZQAoACkADQAKAGUAbABzAGUADQAKAAkAaQBuAF8AYgB1AGMA
awBlAHQAcwBbAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBpAG4AXwBlAG0A
cAB0AHkADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwA
bABfAG8AbABkAF8AcABsAGEAYwBlACAAKwAxAF0APQBpAG4AXwBlAG0AcAB0AHkADQAKAA0A
CgBlAG4AZAAgAHMAdQBiAHIAbwB1AHQAaQBuAGUADQAKAA0ACgBwAHUAYgBsAGkAYwAgAHMA
dQBiAHIAbwB1AHQAaQBuAGUAIABvAGYAXwByAGUAbQBvAHYAZQAgACgAcwB0AHIAaQBuAGcA
IABhAHMAXwBrAGUAeQApACAAdABoAHIAbwB3AHMAIABlAHgAYwBlAHAAdABpAG8AbgA7AGwA
bwBuAGcAIABsAGwAXwBoAGEAcwBoACwAIABsAGwAXwBpAG4AZABlAHgADQAKAG4AXwBjAHMA
dABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AcAB0AHIALAAgAGwAbgBfAGwAYQBzAHQA
DQAKAA0ACgBpAGYAIABpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA9ADAAIAB0AGgAZQBuAA0A
CgAJAG8AZgBfAHQAaAByAG8AdwAoACcASwBlAHkAIABuAG8AdAAgAGYAbwB1AG4AZAAnACkA
DQAKAGUAbgBkACAAaQBmAA0ACgANAAoAYQBzAF8AawBlAHkAPQBsAG8AdwBlAHIAKABhAHMA
XwBrAGUAeQApAA0ACgANAAoAbABsAF8AaABhAHMAaAA9AG8AZgBfAGgAYQBzAGgAKABhAHMA
XwBrAGUAeQApAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUAYwBrAGUAdABfAG8A
ZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkA
dABfAHAAdAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBsAG4AXwBwAHQAcgA9AGkA
bgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBpAG4AZABlAHgAKwAxAF0ADQAKAA0ACgBkAG8A
IAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQANAAoACQBpAGYA
IABsAG4AXwBwAHQAcgAuAGkAcwBfAG4AYQBtAGUAPQBhAHMAXwBrAGUAeQAgAHQAaABlAG4A
DQAKAAkACQBpAGYAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AbABhAHMAdAApACAAdABoAGUA
bgANAAoACQAJAAkAbABuAF8AbABhAHMAdAAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBwAHQA
cgAuAGkAbgBfAG4AZQB4AHQADQAKAAkACQBlAGwAcwBlAA0ACgAJAAkACQBpAG4AXwBiAHUA
YwBrAGUAdABzAFsAbABsAF8AaQBuAGQAZQB4ACsAMQBdAD0AbABuAF8AcAB0AHIALgBpAG4A
XwBuAGUAeAB0AA0ACgAJAAkAZQBuAGQAIABpAGYADQAKAAkACQBkAGUAcwB0AHIAbwB5ACAA
bABuAF8AcAB0AHIADQAKAAkACQBpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAAgAC0ALQANAAoA
CQAJAG8AZgBfAG0AZQByAGcAZQBfAGIAdQBjAGsAZQB0ACgAKQANAAoACQAJAHIAZQB0AHUA
cgBuAA0ACgAJAGUAbgBkACAAaQBmAA0ACgAJAA0ACgAJAGwAbgBfAGwAYQBzAHQAPQBsAG4A
XwBwAHQAcgANAAoACQBsAG4AXwBwAHQAcgA9AGwAbgBfAHAAdAByAC4AaQBuAF8AbgBlAHgA
dAANAAoAbABvAG8AcAANAAoADQAKAG8AZgBfAHQAaAByAG8AdwAoACcASwBlAHkAIABuAG8A
dAAgAGYAbwB1AG4AZAAnACkADQAKAGUAbgBkACAAcwB1AGIAcgBvAHUAdABpAG4AZQANAAoA
DQAKAHAAcgBpAHYAYQB0AGUAIABmAHUAbgBjAHQAaQBvAG4AIABsAG8AbgBnACAAbwBmAF8A
YgB1AGMAawBlAHQAXwBvAGYAZgBzAGUAdAAgACgAbABvAG4AZwAgAGEAbABfAG0AYQB4AF8A
cwBwAGwAaQB0ACwAIABsAG8AbgBnACAAYQBsAF8AcwBwAGwAaQB0AF8AcAB0AHIALAAgAHUA
bgBzAGkAZwBuAGUAZABsAG8AbgBnACAAYQBsAF8AaABhAHMAaABfAHYAYQBsACkAOwBpAGYA
IABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEAbABfAG0AYQB4AF8AcwBwAGwA
aQB0ACkAPABhAGwAXwBzAHAAbABpAHQAXwBwAHQAcgAgAHQAaABlAG4ADQAKAAkAcgBlAHQA
dQByAG4AIABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEAbABfAG0AYQB4AF8A
cwBwAGwAaQB0ACAAKwAgAGEAbABfAG0AYQB4AF8AcwBwAGwAaQB0ACkADQAKAGUAbABzAGUA
DQAKAAkAcgBlAHQAdQByAG4AIABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEA
bABfAG0AYQB4AF8AcwBwAGwAaQB0ACkADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAZQBuAGQA
IABmAHUAbgBjAHQAaQBvAG4ADQAKAA0ACgBwAHUAYgBsAGkAYwAgAHMAdQBiAHIAbwB1AHQA
aQBuAGUAIABvAGYAXwBhAGQAZAAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBuAGEAbQBlACwA
IABhAG4AeQAgAGEAYQBfAHYAYQBsAHUAZQAsACAAYgBvAG8AbABlAGEAbgAgAGEAYgBfAGYA
YQBpAGwAXwBlAHgAaQBzAHQAcwApACAAdABoAHIAbwB3AHMAIABlAHgAYwBlAHAAdABpAG8A
bgA7AGwAbwBuAGcAIABsAGwAXwBoAGEAcwBoACwAIABsAGwAXwBpAG4AZABlAHgADQAKAG4A
XwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AcAB0AHIALAAgAGwAbgBfAGwA
YQBzAHQALAAgAGwAbgBfAG4AZQB3AA0ACgANAAoAYQBzAF8AbgBhAG0AZQA9AGwAbwB3AGUA
cgAoAGEAcwBfAG4AYQBtAGUAKQANAAoADQAKAGwAbABfAGgAYQBzAGgAPQBvAGYAXwBoAGEA
cwBoACgAYQBzAF8AbgBhAG0AZQApAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUA
YwBrAGUAdABfAG8AZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkA
bABfAHMAcABsAGkAdABfAHAAdAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBpAGYA
IABpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA+ADAAIAB0AGgAZQBuAA0ACgAJAGwAbgBfAHAA
dAByAD0AaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAGkAbgBkAGUAeAArADEAXQANAAoA
CQANAAoACQBkAG8AIAB3AGgAaQBsAGUAIAB0AHIAdQBlAA0ACgAJAAkAaQBmACAAbgBvAHQA
IABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQAgAHQAaABlAG4AIABlAHgAaQB0AA0A
CgAJAAkADQAKAAkACQBpAGYAIABsAG4AXwBwAHQAcgAuAGkAbABfAGgAYQBzAGgAPQBsAGwA
XwBoAGEAcwBoACAAdABoAGUAbgANAAoACQAJAAkAaQBmACAAbABuAF8AcAB0AHIALgBpAHMA
XwBuAGEAbQBlAD0AYQBzAF8AbgBhAG0AZQAgAHQAaABlAG4ADQAKAAkACQAJAAkAaQBmACAA
YQBiAF8AZgBhAGkAbABfAGUAeABpAHMAdABzACAAdABoAGUAbgANAAoACQAJAAkACQAJAC8A
LwAgAG8AbgBsAHkAIABmAGEAaQBsACAAaQBmACAAdABoAGUAeQAgAGEAcgBlACAAZABpAGYA
ZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAHIAIAB2AGEAbAB1AGUAcwANAAoACQAJAAkA
CQAJAGkAZgAgAGMAbABhAHMAcwBuAGEAbQBlACgAbABuAF8AcAB0AHIALgBpAGEAXwB2AGEA
bAB1AGUAKQA8AD4AYwBsAGEAcwBzAG4AYQBtAGUAKABhAGEAXwB2AGEAbAB1AGUAKQAgAHQA
aABlAG4ADQAKAAkACQAJAAkACQAJAG8AZgBfAHQAaAByAG8AdwAoACcAQQAgAHYAYQBsAHUA
ZQAgAGEAbAByAGUAYQBkAHkAIABlAHgAaQBzAHQAcwAgAGYAbwByACAAJwArAGEAcwBfAG4A
YQBtAGUAKQANAAoACQAJAAkACQAJAGUAbgBkACAAaQBmAA0ACgAJAAkACQAJAAkAaQBmACAA
bABuAF8AcAB0AHIALgBpAGEAXwB2AGEAbAB1AGUAPAA+AGEAYQBfAHYAYQBsAHUAZQAgAHQA
aABlAG4ADQAKAAkACQAJAAkACQAJAG8AZgBfAHQAaAByAG8AdwAoACcAQQAgAHYAYQBsAHUA
ZQAgAGEAbAByAGUAYQBkAHkAIABlAHgAaQBzAHQAcwAgAGYAbwByACAAJwArAGEAcwBfAG4A
YQBtAGUAKQANAAoACQAJAAkACQAJAGUAbgBkACAAaQBmAA0ACgAJAAkACQAJAGUAbABzAGUA
DQAKAAkACQAJAAkACQAvAC8AIAByAGUAcABsAGEAYwBlACAAdABoAGUAIABlAHgAaQBzAHQA
aQBuAGcAIAB2AGEAbAB1AGUADQAKAAkACQAJAAkACQBsAG4AXwBwAHQAcgAuAGkAYQBfAHYA
YQBsAHUAZQA9AGEAYQBfAHYAYQBsAHUAZQANAAoACQAJAAkACQBlAG4AZAAgAGkAZgANAAoA
CQAJAAkACQByAGUAdAB1AHIAbgANAAoACQAJAAkAZQBuAGQAIABpAGYADQAKAAkACQBlAG4A
ZAAgAGkAZgANAAoACQAJAA0ACgAJAAkAaQBmACAAYQBzAF8AbgBhAG0AZQAgADwAIABsAG4A
XwBwAHQAcgAuAGkAcwBfAG4AYQBtAGUAIAB0AGgAZQBuACAAZQB4AGkAdAANAAoACQAJAA0A
CgAJAAkAbABuAF8AbABhAHMAdAA9AGwAbgBfAHAAdAByAA0ACgAJAAkAbABuAF8AcAB0AHIA
PQBsAG4AXwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQADQAKAAkAbABvAG8AcAANAAoAZQBuAGQA
IABpAGYADQAKAA0ACgBsAG4AXwBuAGUAdwA9AGMAcgBlAGEAdABlACAAbgBfAGMAcwB0AF8A
aABhAHMAaABfAGwAaQBzAHQADQAKAGwAbgBfAG4AZQB3AC4AaQBzAF8AbgBhAG0AZQA9AGEA
cwBfAG4AYQBtAGUADQAKAGwAbgBfAG4AZQB3AC4AaQBhAF8AdgBhAGwAdQBlAD0AYQBhAF8A
dgBhAGwAdQBlAA0ACgBsAG4AXwBuAGUAdwAuAGkAbABfAGgAYQBzAGgAPQBsAGwAXwBoAGEA
cwBoAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAGwAYQBzAHQAKQAgAHQA
aABlAG4ADQAKAAkAbABuAF8AbABhAHMAdAAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBuAGUA
dwANAAoAZQBsAHMAZQANAAoACQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8AaQBuAGQA
ZQB4ACsAMQBdAD0AbABuAF8AbgBlAHcADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8A
bgBlAHcALgBpAG4AXwBuAGUAeAB0AD0AbABuAF8AcAB0AHIADQAKAA0ACgBpAGwAXwBrAGUA
eQBfAGMAbwB1AG4AdAArACsADQAKAGkAZgAgAGkAbABfAGsAZQB5AF8AYwBvAHUAbgB0AD4A
IAB1AHAAcABlAHIAYgBvAHUAbgBkACgAaQBuAF8AYgB1AGMAawBlAHQAcwApACAAdABoAGUA
bgANAAoACQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAaQBsAF8AawBlAHkAXwBjAG8AdQBuAHQA
XQA9AGkAbgBfAGUAbQBwAHQAeQANAAoAZQBuAGQAIABpAGYADQAKAA0ACgBvAGYAXwBzAHAA
bABpAHQAXwBiAHUAYwBrAGUAdAAoACkADQAKAGUAbgBkACAAcwB1AGIAcgBvAHUAdABpAG4A
ZQANAAoADQAKAHAAdQBiAGwAaQBjACAAZgB1AG4AYwB0AGkAbwBuACAAYgBvAG8AbABlAGEA
bgAgAG8AZgBfAGcAZQB0ACAAKABzAHQAcgBpAG4AZwAgAGEAcwBfAGsAZQB5ACwAIAByAGUA
ZgAgAGEAbgB5ACAAYQBhAF8AcgBlAHQAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQA
aQBvAG4AOwBsAG8AbgBnACAAbABsAF8AaABhAHMAaAANAAoAbABvAG4AZwAgAGwAbABfAGkA
bgBkAGUAeAA9AC0AMQANAAoAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABsAG4A
XwBsAGkAcwB0AA0ACgANAAoAYQBzAF8AawBlAHkAPQBsAG8AdwBlAHIAKABhAHMAXwBrAGUA
eQApAA0ACgBsAGwAXwBoAGEAcwBoAD0AbwBmAF8AaABhAHMAaAAoAGEAcwBfAGsAZQB5ACkA
DQAKAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUAYwBrAGUAdABfAG8AZgBmAHMA
ZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkAdABfAHAA
dAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBpAGYAIABsAGwAXwBpAG4AZABlAHgA
KwAxACAAPAAgADEAIABvAHIAIABsAGwAXwBpAG4AZABlAHgAIAArADEAIAA+ACAAdQBwAHAA
ZQByAGIAbwB1AG4AZAAoAGkAbgBfAGIAdQBjAGsAZQB0AHMAKQAgAHQAaABlAG4ADQAKAAkA
cgBlAHQAdQByAG4AIABmAGEAbABzAGUADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8A
bABpAHMAdAA9AGkAbgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBpAG4AZABlAHgAKwAxAF0A
DQAKAA0ACgBkAG8AIAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AbABpAHMA
dAApAA0ACgAJAGkAZgAgAGwAbgBfAGwAaQBzAHQALgBpAGwAXwBoAGEAcwBoAD0AbABsAF8A
aABhAHMAaAAgAHQAaABlAG4ADQAKAAkACQBpAGYAIABsAG4AXwBsAGkAcwB0AC4AaQBzAF8A
bgBhAG0AZQA9AGEAcwBfAGsAZQB5ACAAdABoAGUAbgANAAoACQAJAAkAYQBhAF8AcgBlAHQA
PQBsAG4AXwBsAGkAcwB0AC4AaQBhAF8AdgBhAGwAdQBlAA0ACgAJAAkACQByAGUAdAB1AHIA
bgAgAHQAcgB1AGUADQAKAAkACQBlAG4AZAAgAGkAZgANAAoACQBlAG4AZAAgAGkAZgANAAoA
CQBsAG4AXwBsAGkAcwB0AD0AbABuAF8AbABpAHMAdAAuAGkAbgBfAG4AZQB4AHQADQAKAGwA
bwBvAHAADQAKAA0ACgByAGUAdAB1AHIAbgAgAGYAYQBsAHMAZQANAAoADQAKAGUAbgBkACAA
ZgB1AG4AYwB0AGkAbwBuAA0ACgANAAoAcAB1AGIAbABpAGMAIABzAHUAYgByAG8AdQB0AGkA
bgBlACAAbwBmAF8AYwBsAGUAYQBuAF8AdQBwACAAKAApADsAbABvAG4AZwAgAGwAbABfAGkA
DQAKAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AaQB0AGUAbQAsACAA
bABuAF8AbgBlAHgAdAAsACAAbABuAF8AZQBtAHAAdAB5AFsAXQANAAoADQAKAGYAbwByACAA
bABsAF8AaQAgAD0AIABsAG8AdwBlAHIAYgBvAHUAbgBkACgAaQBuAF8AYgB1AGMAawBlAHQA
cwApACAAdABvACAAdQBwAHAAZQByAGIAbwB1AG4AZAAoAGkAbgBfAGIAdQBjAGsAZQB0AHMA
KQANAAoACQBsAG4AXwBpAHQAZQBtAD0AaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAGkA
XQANAAoACQBkAG8AIAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AaQB0AGUA
bQApAA0ACgAJAAkAbABuAF8AbgBlAHgAdAA9AGwAbgBfAGkAdABlAG0ALgBpAG4AXwBuAGUA
eAB0AA0ACgAJAAkAZABlAHMAdAByAG8AeQAgAGwAbgBfAGkAdABlAG0ADQAKAAkACQBsAG4A
XwBpAHQAZQBtAD0AbABuAF8AbgBlAHgAdAANAAoACQBsAG8AbwBwAA0ACgBuAGUAeAB0AA0A
CgANAAoAaQBuAF8AYgB1AGMAawBlAHQAcwA9AGwAbgBfAGUAbQBwAHQAeQANAAoADQAKAGkA
bABfAHMAcABsAGkAdABfAHAAdAByAD0AMAANAAoAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQA
PQAxAA0ACgBpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA9ADAADQAKAGUAbgBkACAAcwB1AGIA
cgBvAHUAdABpAG4AZQANAAoADQAKAG8AbgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwB0AGEA
YgBsAGUALgBjAHIAZQBhAHQAZQANAAoAYwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAYwByAGUA
YQB0AGUADQAKAHQAaABpAHMALgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAA9AGMA
cgBlAGEAdABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQADQAKAFQAcgBpAGcA
ZwBlAHIARQB2AGUAbgB0ACgAIAB0AGgAaQBzACwAIAAiAGMAbwBuAHMAdAByAHUAYwB0AG8A
cgAiACAAKQANAAoAZQBuAGQAIABvAG4ADQAKAA0ACgBvAG4AIABuAF8AYwBzAHQAXwBoAGEA
cwBoAF8AdABhAGIAbABlAC4AZABlAHMAdAByAG8AeQANAAoAVAByAGkAZwBnAGUAcgBFAHYA
ZQBuAHQAKAAgAHQAaABpAHMALAAgACIAZABlAHMAdAByAHUAYwB0AG8AcgAiACAAKQANAAoA
YwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAZABlAHMAdAByAG8AeQANAAoAZABlAHMAdAByAG8A
eQAoAHQAaABpAHMALgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAApAA0ACgBlAG4A
ZAAgAG8AbgANAAoADQAKAGUAdgBlAG4AdAAgAGQAZQBzAHQAcgB1AGMAdABvAHIAOwBpAGYA
IABpAHMAdgBhAGwAaQBkACgAdABoAGkAcwApACAAdABoAGUAbgAgAG8AZgBfAGMAbABlAGEA
bgBfAHUAcAAoACkADQAKAA0ACgANAAoAZQBuAGQAIABlAHYAZQBuAHQADQAKAA0ACgB0AHkA
cABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABmAHIAbwBtACAAbgBvAG4A
dgBpAHMAdQBhAGwAbwBiAGoAZQBjAHQAIAB3AGkAdABoAGkAbgAgAG4AXwBjAHMAdABfAGgA
YQBzAGgAXwB0AGEAYgBsAGUAIABkAGUAcwBjAHIAaQBwAHQAbwByACAAIgBwAGIAXwBuAHYA
bwAiACAAPQAgACIAdAByAHUAZQAiACAADQAKAGUAbgBkACAAdAB5AHAAZQANAAoADQAKAHQA
eQBwAGUAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoAbABvAG4AZwAgAGkAbABfAGgAYQBzAGgA
DQAKAHMAdAByAGkAbgBnACAAaQBzAF8AbgBhAG0AZQANAAoAYQBuAHkAIABpAGEAXwB2AGEA
bAB1AGUADQAKAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAaQBuAF8AbgBlAHgA
dAANAAoAZQBuAGQAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoADQAKAGYAbwByAHcAYQByAGQA
IABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgBwAHUAYgBsAGkAYwAgAGYAdQBuAGMAdABpAG8A
bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbwBmAF8AcgBlAHYAZQByAHMA
ZQAgACgAKQANAAoAZQBuAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgANAAoAcAB1AGIA
bABpAGMAIABmAHUAbgBjAHQAaQBvAG4AIABuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMA
dAAgAG8AZgBfAHIAZQB2AGUAcgBzAGUAIAAoACkAOwBuAF8AYwBzAHQAXwBoAGEAcwBoAF8A
bABpAHMAdAAgAGwAbgBfAHAAdAByACwAIABsAG4AXwBsAGEAcwB0ACwAIABsAG4AXwBuAGUA
eAB0AA0ACgANAAoAbABuAF8AcAB0AHIAPQB0AGgAaQBzAA0ACgBkAG8AIAB3AGgAaQBsAGUA
IABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQANAAoACQBsAG4AXwBuAGUAeAB0AD0A
bABuAF8AcAB0AHIALgBpAG4AXwBuAGUAeAB0AA0ACgAJAA0ACgAJAGwAbgBfAHAAdAByAC4A
aQBuAF8AbgBlAHgAdAA9AGwAbgBfAGwAYQBzAHQADQAKAAkAbABuAF8AbABhAHMAdAA9AGwA
bgBfAHAAdAByAA0ACgAJAA0ACgAJAGwAbgBfAHAAdAByAD0AbABuAF8AbgBlAHgAdAANAAoA
bABvAG8AcAANAAoADQAKAHIAZQB0AHUAcgBuACAAbABuAF8AbABhAHMAdAANAAoAZQBuAGQA
IABmAHUAbgBjAHQAaQBvAG4ADQAKAA0ACgBvAG4AIABuAF8AYwBzAHQAXwBoAGEAcwBoAF8A
bABpAHMAdAAuAGMAcgBlAGEAdABlAA0ACgBjAGEAbABsACAAcwB1AHAAZQByADoAOgBjAHIA
ZQBhAHQAZQANAAoAVAByAGkAZwBnAGUAcgBFAHYAZQBuAHQAKAAgAHQAaABpAHMALAAgACIA
YwBvAG4AcwB0AHIAdQBjAHQAbwByACIAIAApAA0ACgBlAG4AZAAgAG8AbgANAAoADQAKAG8A
bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0AC4AZABlAHMAdAByAG8AeQANAAoA
VAByAGkAZwBnAGUAcgBFAHYAZQBuAHQAKAAgAHQAaABpAHMALAAgACIAZABlAHMAdAByAHUA
YwB0AG8AcgAiACAAKQANAAoAYwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAZABlAHMAdAByAG8A
eQANAAoAZQBuAGQAIABvAG4ADQAKAA0ACgA=
--------------060201040706020400060704--
0
Jeremy
3/27/2008 11:21:31 AM
I personally never used any of these implementations - there wasn't even 
once a need for it in the last 14 years :-))))

"Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message 
news:47eb833b@forums-1-dub...
> An array of names and an array of objects....
> Can't you guys do any better than that?
>
> The slowest part of this object is the hash function. Replace that with
> an external dll call of some kind and it will be fast enough to store a
> few thousand objects without being a bottleneck.
>
> I have a dll somewhere that does MD5 hashes that I use myself, but the
> code isn't very portable.
>
> Jason 'Bug' Fenter [TeamSybase] wrote:
>> And here's an implementation that I threw together recently. I'll have
>> to review Mr. Ogrinz's version to see how I can improve mine.
>>
>> Philip Salgannik wrote:
>>> Here is an old implementation by Michael Ogrinz
>>>
>>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message
>>> news:47ea1b84$1@forums-1-dub...
>>>> One thing I miss in PowerBuilder development is something like a hash
>>>> array.
>>>>
>>>> Are there any good* implementations/solutions out for PB?
>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>
>>>> *good means for me:
>>>> - no special runtime requirements like additional OLE components or
>>>> special Windows components (like the .NET framework)
>>>> - it shouldn't have much overhead
>>>>
>>>>
>>>> Is there a PBNI implementation?
>>>
>>>
>>
>
>


--------------------------------------------------------------------------------


> ��$PBExportHeader$n_cst_hash_table.sru
> $PBExportComments$ecs.pbl - NEW
> forward
> global type n_cst_hash_table from nonvisualobject
> end type
> type n_cst_hash_list from nonvisualobject within n_cst_hash_table
> end type
> end forward
>
> global type n_cst_hash_table from oleobject
> event ue_documentation ( )
> n_cst_hash_list n_cst_hash_list
> end type
> global n_cst_hash_table n_cst_hash_table
>
> type variables
> private:
> n_cst_hash_list in_buckets[], in_empty
>
> unsignedlong il_split_ptr, il_max_split=1, il_key_count
> end variables
>
> forward prototypes
> private subroutine of_throw(string as_error)
> private function long of_hash (string as_string)
> private subroutine of_split_bucket ()
> private subroutine of_merge_bucket ()
> public subroutine of_remove (string as_key) throws exception
> private function long of_bucket_offset (long al_max_split, long 
> al_split_ptr, unsignedlong al_hash_val)
> public subroutine of_add (string as_name, any aa_value, boolean 
> ab_fail_exists) throws exception
> public function boolean of_get (string as_key, ref any aa_ret) throws 
> exception
> public subroutine of_clean_up ()
> end prototypes
>
> event ue_documentation();// ported this hash implementation to PB from an 
> example found on the net
>
> // an element is found in the table by using mod(hash, n) where n is a 
> power of 2
> // as the table expands n will double
> // to reduce the work of expanding the table, one hash bucket will be 
> split at a time
> // and both hash table sizes will coexist.
>
> // for example:
> // [0 1 2 3] 4 5]
> // buckets 6 and 7 don't yet exist
> // the values can currently be found in buckets 2 and 3 using mod(,4) 
> instead of mod(,8)
> // if we add another element, the bucket at 2 will be split into 
> mod(hash,8)=2 and mod(hash,8)=6
> // if an element was removed, the 2 buckets 2 and 6 would be recombined 
> again.
> end event
>
> private subroutine of_throw(string as_error) throws exception;exception e
> e=create exception
> e.setmessage(as_error)
> throw e
> end subroutine
>
> private function long of_hash (string as_string);
> character lc_values[]
> long ll_i
> unsignedlong ll_ret
>
> lc_values=as_string
> for ll_i = 1 to len(as_string)
> ll_ret+=asc(lc_values[ll_i])+485318
> ll_ret*=2654435761
> next
>
> return ll_ret
> end function
>
> private subroutine of_split_bucket ();long ll_old_place, ll_new_place, 
> ll_i
> n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr
>
> ll_old_place=il_split_ptr
> ll_new_place=ll_old_place+il_max_split
>
> if ll_old_place+1 >= il_max_split then
> if il_key_count < 2 then return
>
> il_max_split += il_max_split
> il_split_ptr=0
> else
> il_split_ptr=ll_old_place+1
> end if
>
> ln_cur_ptr=in_buckets[ll_old_place +1]
>
> do while isvalid(ln_cur_ptr)
> ln_next_ptr=ln_cur_ptr.in_next
>
> if of_bucket_offset(il_max_split, il_split_ptr, 
> ln_cur_ptr.il_hash)=ll_old_place then
> ln_cur_ptr.in_next=ln_old_chain
> ln_old_chain=ln_cur_ptr
> else
> ln_cur_ptr.in_next=ln_new_chain
> ln_new_chain=ln_cur_ptr
> end if
>
> ln_cur_ptr=ln_next_ptr
> loop
>
> if isvalid(ln_old_chain) then
> in_buckets[ll_old_place +1]=ln_old_chain.of_reverse()
> else
> in_buckets[ll_old_place +1]=in_empty
> end if
>
> if isvalid(ln_new_chain) then
> in_buckets[ll_new_place +1]=ln_new_chain.of_reverse()
> else
> in_buckets[ll_new_place +1]=in_empty
> end if
>
> end subroutine
>
> private subroutine of_merge_bucket ();long ll_new_place, ll_old_place
> boolean lb_use_old_chain
> n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp
>
> if il_split_ptr=0 then
> if il_key_count<1 then return
> il_max_split = il_max_split / 2
> il_split_ptr = il_max_split -1
> else
> il_split_ptr --
> end if
>
> ll_new_place=il_split_ptr
> ll_old_place=ll_new_place + il_max_split
>
> ln_old_chain=in_buckets[ll_old_place +1]
> ln_new_chain=in_buckets[ll_new_place +1]
>
> do while isvalid(ln_old_chain) or isvalid(ln_new_chain)
> if not isvalid(ln_old_chain) then
> lb_use_old_chain=false
> elseif not isvalid(ln_new_chain) then
> lb_use_old_chain=true
> else
> lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name
> end if
>
> if lb_use_old_chain then
> ln_tmp=ln_old_chain.in_next
> ln_old_chain.in_next=ln_merge_list
> ln_merge_list=ln_old_chain
> ln_old_chain=ln_tmp
> else
> ln_tmp=ln_new_chain.in_next
> ln_new_chain.in_next=ln_merge_list
> ln_merge_list=ln_new_chain
> ln_new_chain=ln_tmp
> end if
>
> loop
>
> if isvalid(ln_merge_list) then
> in_buckets[ll_new_place +1]=ln_merge_list.of_reverse()
> else
> in_buckets[ll_new_place +1]=in_empty
> end if
>
> in_buckets[ll_old_place +1]=in_empty
>
> end subroutine
>
> public subroutine of_remove (string as_key) throws exception;long ll_hash, 
> ll_index
> n_cst_hash_list ln_ptr, ln_last
>
> if il_key_count=0 then
> of_throw('Key not found')
> end if
>
> as_key=lower(as_key)
>
> ll_hash=of_hash(as_key)
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> ln_ptr=in_buckets[ll_index+1]
>
> do while isvalid(ln_ptr)
> if ln_ptr.is_name=as_key then
> if isvalid(ln_last) then
> ln_last.in_next=ln_ptr.in_next
> else
> in_buckets[ll_index+1]=ln_ptr.in_next
> end if
> destroy ln_ptr
> il_key_count --
> of_merge_bucket()
> return
> end if
>
> ln_last=ln_ptr
> ln_ptr=ln_ptr.in_next
> loop
>
> of_throw('Key not found')
> end subroutine
>
> private function long of_bucket_offset (long al_max_split, long 
> al_split_ptr, unsignedlong al_hash_val);if 
> mod(al_hash_val,al_max_split)<al_split_ptr then
> return mod(al_hash_val,al_max_split + al_max_split)
> else
> return mod(al_hash_val,al_max_split)
> end if
>
> end function
>
> public subroutine of_add (string as_name, any aa_value, boolean 
> ab_fail_exists) throws exception;long ll_hash, ll_index
> n_cst_hash_list ln_ptr, ln_last, ln_new
>
> as_name=lower(as_name)
>
> ll_hash=of_hash(as_name)
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> if il_key_count>0 then
> ln_ptr=in_buckets[ll_index+1]
>
> do while true
> if not isvalid(ln_ptr) then exit
>
> if ln_ptr.il_hash=ll_hash then
> if ln_ptr.is_name=as_name then
> if ab_fail_exists then
> // only fail if they are different types or values
> if classname(ln_ptr.ia_value)<>classname(aa_value) then
> of_throw('A value already exists for '+as_name)
> end if
> if ln_ptr.ia_value<>aa_value then
> of_throw('A value already exists for '+as_name)
> end if
> else
> // replace the existing value
> ln_ptr.ia_value=aa_value
> end if
> return
> end if
> end if
>
> if as_name < ln_ptr.is_name then exit
>
> ln_last=ln_ptr
> ln_ptr=ln_ptr.in_next
> loop
> end if
>
> ln_new=create n_cst_hash_list
> ln_new.is_name=as_name
> ln_new.ia_value=aa_value
> ln_new.il_hash=ll_hash
>
> if isvalid(ln_last) then
> ln_last.in_next=ln_new
> else
> in_buckets[ll_index+1]=ln_new
> end if
>
> ln_new.in_next=ln_ptr
>
> il_key_count++
> if il_key_count> upperbound(in_buckets) then
> in_buckets[il_key_count]=in_empty
> end if
>
> of_split_bucket()
> end subroutine
>
> public function boolean of_get (string as_key, ref any aa_ret) throws 
> exception;long ll_hash
> long ll_index=-1
> n_cst_hash_list ln_list
>
> as_key=lower(as_key)
> ll_hash=of_hash(as_key)
>
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then
> return false
> end if
>
> ln_list=in_buckets[ll_index+1]
>
> do while isvalid(ln_list)
> if ln_list.il_hash=ll_hash then
> if ln_list.is_name=as_key then
> aa_ret=ln_list.ia_value
> return true
> end if
> end if
> ln_list=ln_list.in_next
> loop
>
> return false
>
> end function
>
> public subroutine of_clean_up ();long ll_i
> n_cst_hash_list ln_item, ln_next, ln_empty[]
>
> for ll_i = lowerbound(in_buckets) to upperbound(in_buckets)
> ln_item=in_buckets[ll_i]
> do while isvalid(ln_item)
> ln_next=ln_item.in_next
> destroy ln_item
> ln_item=ln_next
> loop
> next
>
> in_buckets=ln_empty
>
> il_split_ptr=0
> il_max_split=1
> il_key_count=0
> end subroutine
>
> on n_cst_hash_table.create
> call super::create
> this.n_cst_hash_list=create n_cst_hash_list
> TriggerEvent( this, "constructor" )
> end on
>
> on n_cst_hash_table.destroy
> TriggerEvent( this, "destructor" )
> call super::destroy
> destroy(this.n_cst_hash_list)
> end on
>
> event destructor;if isvalid(this) then of_clean_up()
>
>
> end event
>
> type n_cst_hash_list from nonvisualobject within n_cst_hash_table 
> descriptor "pb_nvo" = "true"
> end type
>
> type variables
> long il_hash
> string is_name
> any ia_value
> n_cst_hash_list in_next
> end variables
>
> forward prototypes
> public function n_cst_hash_list of_reverse ()
> end prototypes
>
> public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, 
> ln_last, ln_next
>
> ln_ptr=this
> do while isvalid(ln_ptr)
> ln_next=ln_ptr.in_next
>
> ln_ptr.in_next=ln_last
> ln_last=ln_ptr
>
> ln_ptr=ln_next
> loop
>
> return ln_last
> end function
>
> on n_cst_hash_list.create
> call super::create
> TriggerEvent( this, "constructor" )
> end on
>
> on n_cst_hash_list.destroy
> TriggerEvent( this, "destructor" )
> call super::destroy
> end on
>
> 

0
Philip
3/27/2008 1:20:00 PM
And mine was just an exercise. (It should be enhanced to use datastores 
on scaler data types, for instance.) There's been a couple of times when 
I *thought* I needed this, but like Philip, I realized that it wasn't 
necessary.

I know you're looking for a generic solution, but let's take a look at 
the specifics that you're working with. Are all of your objects of the 
same class? If so, can you serialize them into a datastore? From my 
experience, the datawindow engine is the fastest component within 
PowerScript. Check out the help files under:
DataWindow Reference
    Accessing Data in Code
       Techniques for accessing data
          About DataWindow data expressions
             Getting and storing the data from a DataWindow data expression



Philip Salgannik wrote:
> I personally never used any of these implementations - there wasn't even 
> once a need for it in the last 14 years :-))))
> 
> "Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message 
> news:47eb833b@forums-1-dub...
>> An array of names and an array of objects....
>> Can't you guys do any better than that?
>>
>> The slowest part of this object is the hash function. Replace that with
>> an external dll call of some kind and it will be fast enough to store a
>> few thousand objects without being a bottleneck.
>>
>> I have a dll somewhere that does MD5 hashes that I use myself, but the
>> code isn't very portable.
>>
>> Jason 'Bug' Fenter [TeamSybase] wrote:
>>> And here's an implementation that I threw together recently. I'll have
>>> to review Mr. Ogrinz's version to see how I can improve mine.
>>>
>>> Philip Salgannik wrote:
>>>> Here is an old implementation by Michael Ogrinz
>>>>
>>>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message
>>>> news:47ea1b84$1@forums-1-dub...
>>>>> One thing I miss in PowerBuilder development is something like a hash
>>>>> array.
>>>>>
>>>>> Are there any good* implementations/solutions out for PB?
>>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>>
>>>>> *good means for me:
>>>>> - no special runtime requirements like additional OLE components or
>>>>> special Windows components (like the .NET framework)
>>>>> - it shouldn't have much overhead
>>>>>
>>>>>
>>>>> Is there a PBNI implementation?
>>>>
>>
> 
> 
> --------------------------------------------------------------------------------
> 
> 
>> ��$PBExportHeader$n_cst_hash_table.sru
>> $PBExportComments$ecs.pbl - NEW
>> forward
>> global type n_cst_hash_table from nonvisualobject
>> end type
>> type n_cst_hash_list from nonvisualobject within n_cst_hash_table
>> end type
>> end forward
>>
>> global type n_cst_hash_table from oleobject
>> event ue_documentation ( )
>> n_cst_hash_list n_cst_hash_list
>> end type
>> global n_cst_hash_table n_cst_hash_table
>>
>> type variables
>> private:
>> n_cst_hash_list in_buckets[], in_empty
>>
>> unsignedlong il_split_ptr, il_max_split=1, il_key_count
>> end variables
>>
>> forward prototypes
>> private subroutine of_throw(string as_error)
>> private function long of_hash (string as_string)
>> private subroutine of_split_bucket ()
>> private subroutine of_merge_bucket ()
>> public subroutine of_remove (string as_key) throws exception
>> private function long of_bucket_offset (long al_max_split, long 
>> al_split_ptr, unsignedlong al_hash_val)
>> public subroutine of_add (string as_name, any aa_value, boolean 
>> ab_fail_exists) throws exception
>> public function boolean of_get (string as_key, ref any aa_ret) throws 
>> exception
>> public subroutine of_clean_up ()
>> end prototypes
>>
>> event ue_documentation();// ported this hash implementation to PB from an 
>> example found on the net
>>
>> // an element is found in the table by using mod(hash, n) where n is a 
>> power of 2
>> // as the table expands n will double
>> // to reduce the work of expanding the table, one hash bucket will be 
>> split at a time
>> // and both hash table sizes will coexist.
>>
>> // for example:
>> // [0 1 2 3] 4 5]
>> // buckets 6 and 7 don't yet exist
>> // the values can currently be found in buckets 2 and 3 using mod(,4) 
>> instead of mod(,8)
>> // if we add another element, the bucket at 2 will be split into 
>> mod(hash,8)=2 and mod(hash,8)=6
>> // if an element was removed, the 2 buckets 2 and 6 would be recombined 
>> again.
>> end event
>>
>> private subroutine of_throw(string as_error) throws exception;exception e
>> e=create exception
>> e.setmessage(as_error)
>> throw e
>> end subroutine
>>
>> private function long of_hash (string as_string);
>> character lc_values[]
>> long ll_i
>> unsignedlong ll_ret
>>
>> lc_values=as_string
>> for ll_i = 1 to len(as_string)
>> ll_ret+=asc(lc_values[ll_i])+485318
>> ll_ret*=2654435761
>> next
>>
>> return ll_ret
>> end function
>>
>> private subroutine of_split_bucket ();long ll_old_place, ll_new_place, 
>> ll_i
>> n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr
>>
>> ll_old_place=il_split_ptr
>> ll_new_place=ll_old_place+il_max_split
>>
>> if ll_old_place+1 >= il_max_split then
>> if il_key_count < 2 then return
>>
>> il_max_split += il_max_split
>> il_split_ptr=0
>> else
>> il_split_ptr=ll_old_place+1
>> end if
>>
>> ln_cur_ptr=in_buckets[ll_old_place +1]
>>
>> do while isvalid(ln_cur_ptr)
>> ln_next_ptr=ln_cur_ptr.in_next
>>
>> if of_bucket_offset(il_max_split, il_split_ptr, 
>> ln_cur_ptr.il_hash)=ll_old_place then
>> ln_cur_ptr.in_next=ln_old_chain
>> ln_old_chain=ln_cur_ptr
>> else
>> ln_cur_ptr.in_next=ln_new_chain
>> ln_new_chain=ln_cur_ptr
>> end if
>>
>> ln_cur_ptr=ln_next_ptr
>> loop
>>
>> if isvalid(ln_old_chain) then
>> in_buckets[ll_old_place +1]=ln_old_chain.of_reverse()
>> else
>> in_buckets[ll_old_place +1]=in_empty
>> end if
>>
>> if isvalid(ln_new_chain) then
>> in_buckets[ll_new_place +1]=ln_new_chain.of_reverse()
>> else
>> in_buckets[ll_new_place +1]=in_empty
>> end if
>>
>> end subroutine
>>
>> private subroutine of_merge_bucket ();long ll_new_place, ll_old_place
>> boolean lb_use_old_chain
>> n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp
>>
>> if il_split_ptr=0 then
>> if il_key_count<1 then return
>> il_max_split = il_max_split / 2
>> il_split_ptr = il_max_split -1
>> else
>> il_split_ptr --
>> end if
>>
>> ll_new_place=il_split_ptr
>> ll_old_place=ll_new_place + il_max_split
>>
>> ln_old_chain=in_buckets[ll_old_place +1]
>> ln_new_chain=in_buckets[ll_new_place +1]
>>
>> do while isvalid(ln_old_chain) or isvalid(ln_new_chain)
>> if not isvalid(ln_old_chain) then
>> lb_use_old_chain=false
>> elseif not isvalid(ln_new_chain) then
>> lb_use_old_chain=true
>> else
>> lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name
>> end if
>>
>> if lb_use_old_chain then
>> ln_tmp=ln_old_chain.in_next
>> ln_old_chain.in_next=ln_merge_list
>> ln_merge_list=ln_old_chain
>> ln_old_chain=ln_tmp
>> else
>> ln_tmp=ln_new_chain.in_next
>> ln_new_chain.in_next=ln_merge_list
>> ln_merge_list=ln_new_chain
>> ln_new_chain=ln_tmp
>> end if
>>
>> loop
>>
>> if isvalid(ln_merge_list) then
>> in_buckets[ll_new_place +1]=ln_merge_list.of_reverse()
>> else
>> in_buckets[ll_new_place +1]=in_empty
>> end if
>>
>> in_buckets[ll_old_place +1]=in_empty
>>
>> end subroutine
>>
>> public subroutine of_remove (string as_key) throws exception;long ll_hash, 
>> ll_index
>> n_cst_hash_list ln_ptr, ln_last
>>
>> if il_key_count=0 then
>> of_throw('Key not found')
>> end if
>>
>> as_key=lower(as_key)
>>
>> ll_hash=of_hash(as_key)
>> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>>
>> ln_ptr=in_buckets[ll_index+1]
>>
>> do while isvalid(ln_ptr)
>> if ln_ptr.is_name=as_key then
>> if isvalid(ln_last) then
>> ln_last.in_next=ln_ptr.in_next
>> else
>> in_buckets[ll_index+1]=ln_ptr.in_next
>> end if
>> destroy ln_ptr
>> il_key_count --
>> of_merge_bucket()
>> return
>> end if
>>
>> ln_last=ln_ptr
>> ln_ptr=ln_ptr.in_next
>> loop
>>
>> of_throw('Key not found')
>> end subroutine
>>
>> private function long of_bucket_offset (long al_max_split, long 
>> al_split_ptr, unsignedlong al_hash_val);if 
>> mod(al_hash_val,al_max_split)<al_split_ptr then
>> return mod(al_hash_val,al_max_split + al_max_split)
>> else
>> return mod(al_hash_val,al_max_split)
>> end if
>>
>> end function
>>
>> public subroutine of_add (string as_name, any aa_value, boolean 
>> ab_fail_exists) throws exception;long ll_hash, ll_index
>> n_cst_hash_list ln_ptr, ln_last, ln_new
>>
>> as_name=lower(as_name)
>>
>> ll_hash=of_hash(as_name)
>> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>>
>> if il_key_count>0 then
>> ln_ptr=in_buckets[ll_index+1]
>>
>> do while true
>> if not isvalid(ln_ptr) then exit
>>
>> if ln_ptr.il_hash=ll_hash then
>> if ln_ptr.is_name=as_name then
>> if ab_fail_exists then
>> // only fail if they are different types or values
>> if classname(ln_ptr.ia_value)<>classname(aa_value) then
>> of_throw('A value already exists for '+as_name)
>> end if
>> if ln_ptr.ia_value<>aa_value then
>> of_throw('A value already exists for '+as_name)
>> end if
>> else
>> // replace the existing value
>> ln_ptr.ia_value=aa_value
>> end if
>> return
>> end if
>> end if
>>
>> if as_name < ln_ptr.is_name then exit
>>
>> ln_last=ln_ptr
>> ln_ptr=ln_ptr.in_next
>> loop
>> end if
>>
>> ln_new=create n_cst_hash_list
>> ln_new.is_name=as_name
>> ln_new.ia_value=aa_value
>> ln_new.il_hash=ll_hash
>>
>> if isvalid(ln_last) then
>> ln_last.in_next=ln_new
>> else
>> in_buckets[ll_index+1]=ln_new
>> end if
>>
>> ln_new.in_next=ln_ptr
>>
>> il_key_count++
>> if il_key_count> upperbound(in_buckets) then
>> in_buckets[il_key_count]=in_empty
>> end if
>>
>> of_split_bucket()
>> end subroutine
>>
>> public function boolean of_get (string as_key, ref any aa_ret) throws 
>> exception;long ll_hash
>> long ll_index=-1
>> n_cst_hash_list ln_list
>>
>> as_key=lower(as_key)
>> ll_hash=of_hash(as_key)
>>
>> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>>
>> if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then
>> return false
>> end if
>>
>> ln_list=in_buckets[ll_index+1]
>>
>> do while isvalid(ln_list)
>> if ln_list.il_hash=ll_hash then
>> if ln_list.is_name=as_key then
>> aa_ret=ln_list.ia_value
>> return true
>> end if
>> end if
>> ln_list=ln_list.in_next
>> loop
>>
>> return false
>>
>> end function
>>
>> public subroutine of_clean_up ();long ll_i
>> n_cst_hash_list ln_item, ln_next, ln_empty[]
>>
>> for ll_i = lowerbound(in_buckets) to upperbound(in_buckets)
>> ln_item=in_buckets[ll_i]
>> do while isvalid(ln_item)
>> ln_next=ln_item.in_next
>> destroy ln_item
>> ln_item=ln_next
>> loop
>> next
>>
>> in_buckets=ln_empty
>>
>> il_split_ptr=0
>> il_max_split=1
>> il_key_count=0
>> end subroutine
>>
>> on n_cst_hash_table.create
>> call super::create
>> this.n_cst_hash_list=create n_cst_hash_list
>> TriggerEvent( this, "constructor" )
>> end on
>>
>> on n_cst_hash_table.destroy
>> TriggerEvent( this, "destructor" )
>> call super::destroy
>> destroy(this.n_cst_hash_list)
>> end on
>>
>> event destructor;if isvalid(this) then of_clean_up()
>>
>>
>> end event
>>
>> type n_cst_hash_list from nonvisualobject within n_cst_hash_table 
>> descriptor "pb_nvo" = "true"
>> end type
>>
>> type variables
>> long il_hash
>> string is_name
>> any ia_value
>> n_cst_hash_list in_next
>> end variables
>>
>> forward prototypes
>> public function n_cst_hash_list of_reverse ()
>> end prototypes
>>
>> public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, 
>> ln_last, ln_next
>>
>> ln_ptr=this
>> do while isvalid(ln_ptr)
>> ln_next=ln_ptr.in_next
>>
>> ln_ptr.in_next=ln_last
>> ln_last=ln_ptr
>>
>> ln_ptr=ln_next
>> loop
>>
>> return ln_last
>> end function
>>
>> on n_cst_hash_list.create
>> call super::create
>> TriggerEvent( this, "constructor" )
>> end on
>>
>> on n_cst_hash_list.destroy
>> TriggerEvent( this, "destructor" )
>> call super::destroy
>> end on
>>
>>
> 
0
Jason
3/27/2008 2:09:01 PM
Hmmmmmmm - maybe something to add to PocketBuilder...

Ideally I'd approach this as an object - maybe I'll copy some ideas
from Java in my copious spare time...
(makes you wish we had generics - 'eh?)

Regards,
Reed Shilts
<Standard-Disclaimers-Apply/>

On 26 Mar 2008 05:01:33 -0800, JKorth <nooospaaam_jk@epos-gmbh.de>
wrote:

>Reed Shilts [Sybase] schrieb:
>> Isn't this what a database is good at ?
>Hm - I use the database only for permanent storage.
>> 
>> Or are you looking for something lighter weight (or for only a few
>> entries...)
>Yes - lightweight but not limited
>(I think of something like the hash arrays in PHP and Perl which are THE 
>data structure for all uses - highly optimized like nothing else)

0
Reed
3/27/2008 7:14:28 PM
Reed, don't forget queues, stacks, and linked lists. (Yes, I've created 
those and they're dead-simple, but if you're going to be adding stuff...)


Reed Shilts [Sybase] wrote:
> Hmmmmmmm - maybe something to add to PocketBuilder...
> 
> Ideally I'd approach this as an object - maybe I'll copy some ideas
> from Java in my copious spare time...
> (makes you wish we had generics - 'eh?)
> 
> Regards,
> Reed Shilts
> <Standard-Disclaimers-Apply/>
> 
> On 26 Mar 2008 05:01:33 -0800, JKorth <nooospaaam_jk@epos-gmbh.de>
> wrote:
> 
>> Reed Shilts [Sybase] schrieb:
>>> Isn't this what a database is good at ?
>> Hm - I use the database only for permanent storage.
>>> Or are you looking for something lighter weight (or for only a few
>>> entries...)
>> Yes - lightweight but not limited
>> (I think of something like the hash arrays in PHP and Perl which are THE 
>> data structure for all uses - highly optimized like nothing else)
> 
0
Jason
3/27/2008 8:18:25 PM
IIRC, at one point it was going to be part of Next Gen PowerScript or
whatever they were calling it. One can only hope...

Just dreaming,

Terry [TeamSybase] and Sequel the techno-kitten

On 26 Mar 2008 06:08:35 -0800, "Dave Fish [TeamSybase]"
<dfish@[N0Spam]sybase.com> wrote:

>I don't see this type of functionality being added to native
>PowerBuilder PowerScript. You can do it in a .NET target and
>PowerBuilder 12 will offer language enhancements for WPF Targets. 
>
>Regards,
>Dave Fish
>Sybase
>
>PowerBuilder Blog:
>http://powerbuilderevangelist.blogspot.com/
>
>On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]"
><sequel@techno-kitten.com> wrote:
>
>>A DataWindow approach is OK for scalar values, but won't help for any 
>>complex data types, like window handles or NVOs.
>>
>>We need something native that performs better than the PowerScript 
>>implementations. <hint, hint>
>>
>>Just my two cents,
>>
>>Terry [TeamSybase] and Sequel the techno-kitten
>>
>>Dave Fish [TeamSybase] wrote:
>>> I agree. An external DataWindow and a datastore should provide this
>>> functionality. 
>>> 
>>> Regards,
>>> Dave Fish
>>> Sybase
>>> 
>>> PowerBuilder Blog:
>>> http://powerbuilderevangelist.blogspot.com/
>>> 
>>> On 26 Mar 2008 03:39:11 -0800, fisher
>>> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:
>>> 
>>>> Hi JKorth,
>>>>
>>>> it should not be that hard to implement using datastore.
>>>> Have you checked pfc if it contains what you need ?
>>>>
>>>> Regards
>>>>
>>>> JKorth pisze:
>>>>> One thing I miss in PowerBuilder development is something like a hash 
>>>>> array.
>>>>>
>>>>> Are there any good* implementations/solutions out for PB?
>>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>>
>>>>> *good means for me:
>>>>> - no special runtime requirements like additional OLE components or 
>>>>> special Windows components (like the .NET framework)
>>>>> - it shouldn't have much overhead
>>>>>
>>>>>
>>>>> Is there a PBNI implementation?

*********************************
Build your vocabulary while feeding the hungry
http://www.freerice.com
*********************************
Newsgroup User Manual
=====================
TeamSybase <> Sybase employee
Forums = Peer-to-peer
Forums <> Communication with Sybase
IsNull (AnswerTo (Posting)) can return TRUE
Forums.Moderated = TRUE, so behave or be deleted
*********************************

Sequel's Sandbox: http://www.techno-kitten.com
Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. 
Version 4.0.3 now available at the Sandbox
PB Futures updated Feb 22/2008
See the PB Troubleshooting & Migration Guides at the Sandbox
^ ^
o o
=*=
0
Terry
3/28/2008 1:11:11 AM
The MS Crypto package does hashes. 
http://www.topwizprogramming.com/freecode_crypto.html

"Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message 
news:47eb833b@forums-1-dub...
> An array of names and an array of objects....
> Can't you guys do any better than that?
>
> The slowest part of this object is the hash function. Replace that with
> an external dll call of some kind and it will be fast enough to store a
> few thousand objects without being a bottleneck.
>
> I have a dll somewhere that does MD5 hashes that I use myself, but the
> code isn't very portable.
>
> Jason 'Bug' Fenter [TeamSybase] wrote:
>> And here's an implementation that I threw together recently. I'll have
>> to review Mr. Ogrinz's version to see how I can improve mine.
>>
>> Philip Salgannik wrote:
>>> Here is an old implementation by Michael Ogrinz
>>>
>>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message
>>> news:47ea1b84$1@forums-1-dub...
>>>> One thing I miss in PowerBuilder development is something like a hash
>>>> array.
>>>>
>>>> Are there any good* implementations/solutions out for PB?
>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>
>>>> *good means for me:
>>>> - no special runtime requirements like additional OLE components or
>>>> special Windows components (like the .NET framework)
>>>> - it shouldn't have much overhead
>>>>
>>>>
>>>> Is there a PBNI implementation?
>>>
>>>
>>
>
>


--------------------------------------------------------------------------------


> ��$PBExportHeader$n_cst_hash_table.sru
> $PBExportComments$ecs.pbl - NEW
> forward
> global type n_cst_hash_table from nonvisualobject
> end type
> type n_cst_hash_list from nonvisualobject within n_cst_hash_table
> end type
> end forward
>
> global type n_cst_hash_table from oleobject
> event ue_documentation ( )
> n_cst_hash_list n_cst_hash_list
> end type
> global n_cst_hash_table n_cst_hash_table
>
> type variables
> private:
> n_cst_hash_list in_buckets[], in_empty
>
> unsignedlong il_split_ptr, il_max_split=1, il_key_count
> end variables
>
> forward prototypes
> private subroutine of_throw(string as_error)
> private function long of_hash (string as_string)
> private subroutine of_split_bucket ()
> private subroutine of_merge_bucket ()
> public subroutine of_remove (string as_key) throws exception
> private function long of_bucket_offset (long al_max_split, long 
> al_split_ptr, unsignedlong al_hash_val)
> public subroutine of_add (string as_name, any aa_value, boolean 
> ab_fail_exists) throws exception
> public function boolean of_get (string as_key, ref any aa_ret) throws 
> exception
> public subroutine of_clean_up ()
> end prototypes
>
> event ue_documentation();// ported this hash implementation to PB from an 
> example found on the net
>
> // an element is found in the table by using mod(hash, n) where n is a 
> power of 2
> // as the table expands n will double
> // to reduce the work of expanding the table, one hash bucket will be 
> split at a time
> // and both hash table sizes will coexist.
>
> // for example:
> // [0 1 2 3] 4 5]
> // buckets 6 and 7 don't yet exist
> // the values can currently be found in buckets 2 and 3 using mod(,4) 
> instead of mod(,8)
> // if we add another element, the bucket at 2 will be split into 
> mod(hash,8)=2 and mod(hash,8)=6
> // if an element was removed, the 2 buckets 2 and 6 would be recombined 
> again.
> end event
>
> private subroutine of_throw(string as_error) throws exception;exception e
> e=create exception
> e.setmessage(as_error)
> throw e
> end subroutine
>
> private function long of_hash (string as_string);
> character lc_values[]
> long ll_i
> unsignedlong ll_ret
>
> lc_values=as_string
> for ll_i = 1 to len(as_string)
> ll_ret+=asc(lc_values[ll_i])+485318
> ll_ret*=2654435761
> next
>
> return ll_ret
> end function
>
> private subroutine of_split_bucket ();long ll_old_place, ll_new_place, 
> ll_i
> n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr
>
> ll_old_place=il_split_ptr
> ll_new_place=ll_old_place+il_max_split
>
> if ll_old_place+1 >= il_max_split then
> if il_key_count < 2 then return
>
> il_max_split += il_max_split
> il_split_ptr=0
> else
> il_split_ptr=ll_old_place+1
> end if
>
> ln_cur_ptr=in_buckets[ll_old_place +1]
>
> do while isvalid(ln_cur_ptr)
> ln_next_ptr=ln_cur_ptr.in_next
>
> if of_bucket_offset(il_max_split, il_split_ptr, 
> ln_cur_ptr.il_hash)=ll_old_place then
> ln_cur_ptr.in_next=ln_old_chain
> ln_old_chain=ln_cur_ptr
> else
> ln_cur_ptr.in_next=ln_new_chain
> ln_new_chain=ln_cur_ptr
> end if
>
> ln_cur_ptr=ln_next_ptr
> loop
>
> if isvalid(ln_old_chain) then
> in_buckets[ll_old_place +1]=ln_old_chain.of_reverse()
> else
> in_buckets[ll_old_place +1]=in_empty
> end if
>
> if isvalid(ln_new_chain) then
> in_buckets[ll_new_place +1]=ln_new_chain.of_reverse()
> else
> in_buckets[ll_new_place +1]=in_empty
> end if
>
> end subroutine
>
> private subroutine of_merge_bucket ();long ll_new_place, ll_old_place
> boolean lb_use_old_chain
> n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp
>
> if il_split_ptr=0 then
> if il_key_count<1 then return
> il_max_split = il_max_split / 2
> il_split_ptr = il_max_split -1
> else
> il_split_ptr --
> end if
>
> ll_new_place=il_split_ptr
> ll_old_place=ll_new_place + il_max_split
>
> ln_old_chain=in_buckets[ll_old_place +1]
> ln_new_chain=in_buckets[ll_new_place +1]
>
> do while isvalid(ln_old_chain) or isvalid(ln_new_chain)
> if not isvalid(ln_old_chain) then
> lb_use_old_chain=false
> elseif not isvalid(ln_new_chain) then
> lb_use_old_chain=true
> else
> lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name
> end if
>
> if lb_use_old_chain then
> ln_tmp=ln_old_chain.in_next
> ln_old_chain.in_next=ln_merge_list
> ln_merge_list=ln_old_chain
> ln_old_chain=ln_tmp
> else
> ln_tmp=ln_new_chain.in_next
> ln_new_chain.in_next=ln_merge_list
> ln_merge_list=ln_new_chain
> ln_new_chain=ln_tmp
> end if
>
> loop
>
> if isvalid(ln_merge_list) then
> in_buckets[ll_new_place +1]=ln_merge_list.of_reverse()
> else
> in_buckets[ll_new_place +1]=in_empty
> end if
>
> in_buckets[ll_old_place +1]=in_empty
>
> end subroutine
>
> public subroutine of_remove (string as_key) throws exception;long ll_hash, 
> ll_index
> n_cst_hash_list ln_ptr, ln_last
>
> if il_key_count=0 then
> of_throw('Key not found')
> end if
>
> as_key=lower(as_key)
>
> ll_hash=of_hash(as_key)
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> ln_ptr=in_buckets[ll_index+1]
>
> do while isvalid(ln_ptr)
> if ln_ptr.is_name=as_key then
> if isvalid(ln_last) then
> ln_last.in_next=ln_ptr.in_next
> else
> in_buckets[ll_index+1]=ln_ptr.in_next
> end if
> destroy ln_ptr
> il_key_count --
> of_merge_bucket()
> return
> end if
>
> ln_last=ln_ptr
> ln_ptr=ln_ptr.in_next
> loop
>
> of_throw('Key not found')
> end subroutine
>
> private function long of_bucket_offset (long al_max_split, long 
> al_split_ptr, unsignedlong al_hash_val);if 
> mod(al_hash_val,al_max_split)<al_split_ptr then
> return mod(al_hash_val,al_max_split + al_max_split)
> else
> return mod(al_hash_val,al_max_split)
> end if
>
> end function
>
> public subroutine of_add (string as_name, any aa_value, boolean 
> ab_fail_exists) throws exception;long ll_hash, ll_index
> n_cst_hash_list ln_ptr, ln_last, ln_new
>
> as_name=lower(as_name)
>
> ll_hash=of_hash(as_name)
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> if il_key_count>0 then
> ln_ptr=in_buckets[ll_index+1]
>
> do while true
> if not isvalid(ln_ptr) then exit
>
> if ln_ptr.il_hash=ll_hash then
> if ln_ptr.is_name=as_name then
> if ab_fail_exists then
> // only fail if they are different types or values
> if classname(ln_ptr.ia_value)<>classname(aa_value) then
> of_throw('A value already exists for '+as_name)
> end if
> if ln_ptr.ia_value<>aa_value then
> of_throw('A value already exists for '+as_name)
> end if
> else
> // replace the existing value
> ln_ptr.ia_value=aa_value
> end if
> return
> end if
> end if
>
> if as_name < ln_ptr.is_name then exit
>
> ln_last=ln_ptr
> ln_ptr=ln_ptr.in_next
> loop
> end if
>
> ln_new=create n_cst_hash_list
> ln_new.is_name=as_name
> ln_new.ia_value=aa_value
> ln_new.il_hash=ll_hash
>
> if isvalid(ln_last) then
> ln_last.in_next=ln_new
> else
> in_buckets[ll_index+1]=ln_new
> end if
>
> ln_new.in_next=ln_ptr
>
> il_key_count++
> if il_key_count> upperbound(in_buckets) then
> in_buckets[il_key_count]=in_empty
> end if
>
> of_split_bucket()
> end subroutine
>
> public function boolean of_get (string as_key, ref any aa_ret) throws 
> exception;long ll_hash
> long ll_index=-1
> n_cst_hash_list ln_list
>
> as_key=lower(as_key)
> ll_hash=of_hash(as_key)
>
> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash)
>
> if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then
> return false
> end if
>
> ln_list=in_buckets[ll_index+1]
>
> do while isvalid(ln_list)
> if ln_list.il_hash=ll_hash then
> if ln_list.is_name=as_key then
> aa_ret=ln_list.ia_value
> return true
> end if
> end if
> ln_list=ln_list.in_next
> loop
>
> return false
>
> end function
>
> public subroutine of_clean_up ();long ll_i
> n_cst_hash_list ln_item, ln_next, ln_empty[]
>
> for ll_i = lowerbound(in_buckets) to upperbound(in_buckets)
> ln_item=in_buckets[ll_i]
> do while isvalid(ln_item)
> ln_next=ln_item.in_next
> destroy ln_item
> ln_item=ln_next
> loop
> next
>
> in_buckets=ln_empty
>
> il_split_ptr=0
> il_max_split=1
> il_key_count=0
> end subroutine
>
> on n_cst_hash_table.create
> call super::create
> this.n_cst_hash_list=create n_cst_hash_list
> TriggerEvent( this, "constructor" )
> end on
>
> on n_cst_hash_table.destroy
> TriggerEvent( this, "destructor" )
> call super::destroy
> destroy(this.n_cst_hash_list)
> end on
>
> event destructor;if isvalid(this) then of_clean_up()
>
>
> end event
>
> type n_cst_hash_list from nonvisualobject within n_cst_hash_table 
> descriptor "pb_nvo" = "true"
> end type
>
> type variables
> long il_hash
> string is_name
> any ia_value
> n_cst_hash_list in_next
> end variables
>
> forward prototypes
> public function n_cst_hash_list of_reverse ()
> end prototypes
>
> public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, 
> ln_last, ln_next
>
> ln_ptr=this
> do while isvalid(ln_ptr)
> ln_next=ln_ptr.in_next
>
> ln_ptr.in_next=ln_last
> ln_last=ln_ptr
>
> ln_ptr=ln_next
> loop
>
> return ln_last
> end function
>
> on n_cst_hash_list.create
> call super::create
> TriggerEvent( this, "constructor" )
> end on
>
> on n_cst_hash_list.destroy
> TriggerEvent( this, "destructor" )
> call super::destroy
> end on
>
> 

0
Jerry
3/28/2008 1:22:02 AM
Language enhancements going forward will be for .NET Targets. Since
you can do this today using .NET Interop I don't think it is something
that will be added to PowerScript itself, but I've been wrong before. 

Regards,
Dave Fish
Sybase

PowerBuilder Blog:
http://powerbuilderevangelist.blogspot.com/

On 27 Mar 2008 17:11:11 -0800, Terry Voth <sequel@techno-kitten.com>
wrote:

>IIRC, at one point it was going to be part of Next Gen PowerScript or
>whatever they were calling it. One can only hope...
>
>Just dreaming,
>
>Terry [TeamSybase] and Sequel the techno-kitten
>
>On 26 Mar 2008 06:08:35 -0800, "Dave Fish [TeamSybase]"
><dfish@[N0Spam]sybase.com> wrote:
>
>>I don't see this type of functionality being added to native
>>PowerBuilder PowerScript. You can do it in a .NET target and
>>PowerBuilder 12 will offer language enhancements for WPF Targets. 
>>
>>Regards,
>>Dave Fish
>>Sybase
>>
>>PowerBuilder Blog:
>>http://powerbuilderevangelist.blogspot.com/
>>
>>On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]"
>><sequel@techno-kitten.com> wrote:
>>
>>>A DataWindow approach is OK for scalar values, but won't help for any 
>>>complex data types, like window handles or NVOs.
>>>
>>>We need something native that performs better than the PowerScript 
>>>implementations. <hint, hint>
>>>
>>>Just my two cents,
>>>
>>>Terry [TeamSybase] and Sequel the techno-kitten
>>>
>>>Dave Fish [TeamSybase] wrote:
>>>> I agree. An external DataWindow and a datastore should provide this
>>>> functionality. 
>>>> 
>>>> Regards,
>>>> Dave Fish
>>>> Sybase
>>>> 
>>>> PowerBuilder Blog:
>>>> http://powerbuilderevangelist.blogspot.com/
>>>> 
>>>> On 26 Mar 2008 03:39:11 -0800, fisher
>>>> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote:
>>>> 
>>>>> Hi JKorth,
>>>>>
>>>>> it should not be that hard to implement using datastore.
>>>>> Have you checked pfc if it contains what you need ?
>>>>>
>>>>> Regards
>>>>>
>>>>> JKorth pisze:
>>>>>> One thing I miss in PowerBuilder development is something like a hash 
>>>>>> array.
>>>>>>
>>>>>> Are there any good* implementations/solutions out for PB?
>>>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets)
>>>>>>
>>>>>> *good means for me:
>>>>>> - no special runtime requirements like additional OLE components or 
>>>>>> special Windows components (like the .NET framework)
>>>>>> - it shouldn't have much overhead
>>>>>>
>>>>>>
>>>>>> Is there a PBNI implementation?
>
>*********************************
>Build your vocabulary while feeding the hungry
>http://www.freerice.com
>*********************************
>Newsgroup User Manual
>=====================
>TeamSybase <> Sybase employee
>Forums = Peer-to-peer
>Forums <> Communication with Sybase
>IsNull (AnswerTo (Posting)) can return TRUE
>Forums.Moderated = TRUE, so behave or be deleted
>*********************************
>
>Sequel's Sandbox: http://www.techno-kitten.com
>Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. 
>Version 4.0.3 now available at the Sandbox
>PB Futures updated Feb 22/2008
>See the PB Troubleshooting & Migration Guides at the Sandbox
>^ ^
>o o
>=*=
0
Dave
3/28/2008 3:49:29 PM
Reply:

Similar Artilces:

Precedence of "where" ("of", "is", "will")?
Nobody on #perl6 today could answer this one. Is: Str | Int where { $_ } the same as: (Str | Int) where { $_ } or: Str | (Int where { $_ }) ? Followup questions, Mr. President: What kind of operators are "where", "of", "is", and "will"? Is there a reason that S03 doesn't list them? What are their precedence(s)? -- Chip Salzenberg - a.k.a. - <chip@pobox.com> Open Source is not an excuse to write fun code then leave the actual work to others. Chip Salzenberg writes: &...

.ALLCOL("%COLUMN%", " ", ", ", ", ")
Do you know anyway for me to exclude a subset of columns returned by this function. We have two columns (rec_user and rec_datetime) which are in all of our tables, but when generating triggers I want automatically generate a script which does not include those two columns but does include all other columns in that table. Bruce I should add that I am using PD 9.0.0.580. Bruce "Bruce Lamb" <lamb.bruce@mayo.edu> wrote in message news:6HgI315nCHA.155@forums.sybase.com... > Do you know anyway for me to exclude a subset of columns returned by this > function. ...

quotes, quotes, quotes...
I am getting this error and I know what is causing it, but I have no idea how to fix it, any help would be great. The script steps through the /var/log/messages file on a linux server and puts The entries into a mysql database. However when it gets to the 'hlt' line in the messages file it just barfs. The single quotes are freaking it out. I know about quotes but not how to use in this situation. Thanks, Paul Error: May 27 17:53:00 localhost kernel: Checking 'hlt' instruction... OK. <----- doesn't like this in the messages file DBD::mysql::st exec...

replace the "." with a ","
Oi.... I need to build a small programm in ASP.NET and chose to use C# for it.Now i got everything working but there's one little problem.the first textbox is a double. I need to make it so that when someone enters a "." then it gets replaced by a ","any ideas?Ghan  string blah = "4.2.2.2";blah = blah.Replace(".", ",");Ryan Ryan OlshanASPInsider | Microsoft MVP, ASP.NEThttp://ryanolshan.comHow to ask a question...

double quote
hello there...  i tried everything of think but not working the way i wanted to be... not sure what i'm missing...i'm generating a <span> in code behind and then using in javascript.... here is what i'm doing code behind: int i=0string _keywordID = "keyword";string _name = row["visit_info_nm"].ToString().Trim(); String _getElementByID = String.Format("<span id='{0}' OnClick = \"document.getElementById('{1}').value='{2}';\">{3}</span><br>", i, _keywordID, _name, _name); here is what it generate : <span id='1' OnClick = \"document.getElementById('keyword')...

Replacing "\\" with "\"
Hi all I'm getting this value from a CheckBoxList control - a location of file, i have to remove "\\" and replace it with "\" and pass it to Query, how to do it, i tried with Replace, but coud'nt suceed. "\\\\Blaze10xp\\BLZ_SFS_07\\Sample Excel Files\\Excel Files\\report2.xls" thank's in advance - Prakash.C you tried Replace like this? string newstring = oldstring.Replace(@"\\",@"\");Plese, do not forget to click "Mark as Answer" on the post that helped you. Thanx!My blog: Scenes From A Developer Memory yes i tr...

"To" and "From" missing
When I print emails, the words "To" and "From" are blank, even though the "To" name and "From name (addresser, addressee) do show up. This is not a problem for other users on my system. Suggestions In mailbox right click, view. On the message window, right click and choose print options. Make sure print header is checked. -- Barry Merchant NSC Volunteer SysOp *** no email unless requested please!! *** > In mailbox right click, view. On the message window, right click and > choose print options. Make sure prin...

"Me" is better than "You"
Yes I know, strings are frozen. But let me talk about it, I really can't get through the idea of a PC talkin to me. I consider my PC as an extension of myself, not a dumb companion who addresses Me as You. Yes there are times when I get angry with Him while I work and get wrong calculations etc.., but it really is my fault, Me using wrong istructions and eventually wanting to find someone else to blame, but it's Me. And yes, I consider Thunderbird my mail program, reading my mail on my PC as Me. So I personally like to have Me in the header bar as a compact address ...

Using "+" or "||"
Using SQLAnywhere 5.5.04, I've gotten into the habit of using "||" in ISQL to indicate a string concatenation. I needed to paste my SQL statement into the PowerBuilder script painter for some embedded SQL, and PB didn't like the "||" very much at all. I changed it to "+" and it seems to be ok. Do these two operators indicate ~exactly~ the same thing? moin, afaik these two's are not the same! if you're using "||" and any term is NULL then in the resultstring the term will be ignored if you use "+" then the resu...

"-" not "_"
I wrote a SQL statement in the data tab. I wrote a bunch of alaises as example ' word-type ' but when I hit the layout tab it converts the "-" to "_". So now my field name is ' word_type '. Is there any way to prevent this? CardGunner Don' use a hypen ( - ).  It isn't a valid character for column names.   See http://searchsqlserver.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid87_gci1188931,00.html   Here's an excerpt about column names: Letters as defined in the Unicode Standard 2.0 Decimal numbers from either B...

"Using" or "With"
Hi all Please can someone enlighten to me as regards the difference with the "Using" and "With" statement when accessing data - which is better, what are the limitations and/or any pointers. Many thanks. Regards DaveDavid WinchesterPlease mark as answer if this is the solution.  using gives you the ability to use the connection and it closes the connection directlly after you finish using it. and there is no need to try- cach - finaly. there is no limitation on using USING keywordMuhanad YOUNISMCSD.NETMy Blog || My Photos || LinkedIn I have a dataobject the re...

Regular Expression to remove "/", "\", "<", ">" and "="
Can anyone please show me the regular expression to reject a string ("<blue", "right>" etc.) which has the following expression in it: "/", "\", "<", ">" and "="  hi, It may Help u.. it is in Class file u may use this expressin in validation controls also. Regex objReg = new Regex(@"^[^,.?/\~|`;:'<>]*$", RegexOptions.Singleline); Regex objReg = new Regex(@"^[^,][^.][^?][^/][^\][^~|][^`][^;][^:][^'][[^<][^>]$", RegexOptions.IgnoreCase);Thanks &...

"JROC" / "JROK" / "JROCK" / "JROQ"
I just started a new contract and the tech lead told me that he wanted me to become familiar with something called "JROC" (among some other tools). I've been searching the web and I haven't found any dev tool called "JROC." Based on the name of the tool, it sounds like it encapsulates some javascript functionality. I have tried searching for different spellings - "JROK" / "JROCK" / "JROQ" but I haven't found any matches. Have you ever heard of a dev tool by this name?...

pulling out "a","an", "the" from beginning of strings
I need to pull out articles "a", "an", and "the" from the beginning of title strings so that they sort properly in MySQL. What is the best way to accomplish that if I have a single $scalar with the whole title in it? Thanks, Tim -- Tim McGeary tim.mcgeary@lehigh.edu --=-A0sE7VNm/n2AMknlC2yn Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On Tue, 2004-08-24 at 15:04, Tim McGeary wrote: > I need to pull out articles "a", "an", and "the" from the beginning of=20 >...

Web resources about - Hash arrays ("associative arrays" / "dictionaries") for PowerBuilder - sybase.powerbuilder.general

Resources last updated: 11/30/2015 6:58:30 PM