Arithmetic operations on memory address pointers
Function to enable valid addition and subtraction of unsigned long integers. Treats the passed value as an unsigned long and returns an unsigned long. Allows safe arithmetic operations on memory address pointers. Assumes valid pointer and pointer offset. Rather fast too, has very small performance hit compared to unsafe in-line calculation, even in intensive loops. The code for addition came from PSC (LukeH) but I needed subtraction as well, thought I'd share. Confirmation that this produces valid results would be appreciated.
AI Summary: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.
<tt> <p nowrap>   <br /> <font color="#006600">' Used for unsigned arithmetic</font><br /> <font color="#000099">Private Const</font> <font color="#660000">DW_MSB</font> <font color="#330033">= &H80000000</font> <font color="#006600">' DWord Most Significant Bit</font><br />   <br /> <font color="#006600">  ' + Sum Unsigned Long ++++++++++++++++++++++<br />   <br />  ' Enables valid addition and subtraction of unsigned long integers.<br />  ' Treats lPtr as an unsigned long and returns an unsigned long.<br />  ' Allows safe arithmetic operations on memory address pointers.<br />  ' Assumes valid pointer and pointer offset.<br /></font>   <br /> <font color="#000099"> Private Function</font> <font color="#330033">SumUnsignedLong</font><font color="#000099">(ByVal</font> <font color="#660000">lPtr</font> <font color="#000099">As Long, ByVal</font> <font color="#660000">lOffset</font> <font color="#000099">As Long) As Long<br />   <br />   If</font> <font color="#660000">lOffset</font> <font color="#330033">> 0&</font> <font color="#000099">Then<br />      If</font> <font color="#660000">lPtr</font> <font color="#000099">And</font> <font color="#660000">DW_MSB</font> <font color="#000099">Then</font>             <font color="#006600">' if ptr < 0</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#660000">lPtr</font> <font color="#330033">+</font> <font color="#660000">lOffset</font> <font color="#006600">' ignors > unsigned max (see assumption)</font><font color="#000099"><br />   <br />      ElseIf (</font><font color="#660000">lPtr</font> <font color="#000099">Or</font> <font color="#660000">DW_MSB</font><font color="#000099">)</font> <font color="#330033">< -</font><font color="#660000">lOffset</font> <font color="#000099">Then</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#660000">lPtr</font> <font color="#330033">+</font> <font color="#660000">lOffset</font> <font color="#006600">' result is below signed int max</font><font color="#000099"><br />   <br />      Else</font>                                <font color="#006600">' result wraps to min signed int</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#000099">(</font><font color="#660000">lPtr</font> <font color="#330033">+</font> <font color="#660000">DW_MSB</font><font color="#000099">)</font> <font color="#330033">+</font> <font color="#000099">(</font><font color="#660000">lOffset</font> <font color="#330033">+</font> <font color="#660000">DW_MSB</font><font color="#000099">)<br />      End If<br />   <br />   ElseIf</font> <font color="#660000">lOffset</font> <font color="#330033">= 0&</font> <font color="#000099">Then</font><br />      <font color="#330033">SumUnsignedLong =</font> <font color="#660000">lPtr</font><font color="#000099"><br />   <br />   Else</font> <font color="#006600">'If lOffset < 0 Then</font><font color="#000099"><br />      If (</font><font color="#660000">lPtr</font> <font color="#000099">And</font> <font color="#660000">DW_MSB</font><font color="#000099">)</font> <font color="#330033">= 0&</font> <font color="#000099">Then</font>      <font color="#006600">' if ptr > 0</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#660000">lPtr</font> <font color="#330033">+</font> <font color="#660000">lOffset</font> <font color="#006600">' ignors unsigned < zero (see assumption)</font><font color="#000099"><br />   <br />      ElseIf (</font><font color="#660000">lPtr</font> <font color="#330033">-</font> <font color="#660000">DW_MSB</font><font color="#000099">)</font> <font color="#330033">>= -</font><font color="#660000">lOffset</font> <font color="#000099">Then</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#660000">lPtr</font> <font color="#330033">+</font> <font color="#660000">lOffset</font> <font color="#006600">' result is above signed int min</font><font color="#000099"><br />   <br />      Else</font>                                <font color="#006600">' result wraps to max signed int</font><br />         <font color="#330033">SumUnsignedLong =</font> <font color="#000099">(</font><font color="#660000">lOffset</font> <font color="#330033">-</font> <font color="#660000">DW_MSB</font><font color="#000099">)</font> <font color="#330033">+</font> <font color="#000099">(</font><font color="#660000">lPtr</font> <font color="#330033">-</font> <font color="#660000">DW_MSB</font><font color="#000099">)<br />      End If<br />   End If<br /> End Function<br /></font>   <br /> <font color="#006600">  ' ++++++++++++++++++++++++++++++++++++++++++<br />   <br />  ' Extract from the classic ShellSort algorithm<br /></font>   <br /> <font color="#000099"> Dim</font> <font color="#660000">s1</font> <font color="#000099">As String,</font> <font color="#660000">lpStr1</font> <font color="#000099">As Long<br /> Dim</font> <font color="#660000">s2</font> <font color="#000099">As String,</font> <font color="#660000">lpStr2</font> <font color="#000099">As Long</font><br />   <br /> <font color="#660000"> lpStr1</font> = <font color="#000099">VarPtr</font>(<font color="#660000">s1</font>)<br /> <font color="#660000"> lpStr2</font> = <font color="#000099">VarPtr</font>(<font color="#660000">s2</font>)<br />   <br /> <font color="#660000"> lpArr</font> = <font color="#000099">VarPtr</font>(<font color="#660000">sArr</font>(<font color="#660000">lb</font>))<br />   <br /> <font color="#006600">  'lpLast = lpArr + ((ub - lb) * 4&) <br /> </font> <font color="#660000">  lpLast</font> = <font color="#330033">SumUnsignedLong</font>(<font color="#660000">lpArr</font>, (<font color="#660000">ub - lb</font>) * 4&)<br /> <font color="#006600">  '...<br /></font>   <br /> <font color="#000099">   CopyMemByV</font> <font color="#660000">lpStr1, lpLast</font>, 4&<br />   <br /> <font color="#006600">   'CopyMemByV lpStr2, lpLast - lRange, 4& <br /> </font> <font color="#000099">   CopyMemByV</font> <font color="#660000">lpStr2</font>, <font color="#330033">SumUnsignedLong</font>(<font color="#660000">lpLast, -lRange</font>), 4&<br />   <br /> <font color="#000099">   If StrComp</font>(<font color="#660000">s2, s1, eMethod</font>) = <font color="#660000">eComp</font> <font color="#000099">Then</font><br /> <font color="#006600">   '...<br /></font>   <br /> </p> </tt>