Vorsicht bei SalStrLop (in TD3.1)

Wenn SalStrLop auf eine leere Zeichenfolge (sString) angewendet wird, können seltsame Dinge geschehen. Grund dafür ist, dass Gupta die interne Pufferlänge auf null setzt. Wenn diese Zeichenfolge mit einer anderen Zeichenfolge (sString2) verkettet wird, wird deren Puffer jedes Mal um eins vermindert. Wenn eine solche Zeichenfolge an eine externe DllFunktion übergeben wird, treten Abstürze auf, weil beim Kopieren des Strings nur nBufferLen Zeichen kopiert werden. In der Regel fehlt die terminierende Null. Den Rest könnt ihr euch denken.
Hier ist Code, der das Problem veranschaulicht:
Set sTest = ''
Set sTest2 = 'A'
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 1 - just the trailing zero
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 2 - 'A' and trailing zero
Call SalStrLop( sTest )
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 0!
Set sTest2 = sTest2 || sTest
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 1!!

Workaround: SalStrLop nur auf nicht leere Strings anwenden. Z.B. mit einer Funktion wie dieser:

!!CB!! 134
Function: StrLopSafe
 Description:
 Returns
  Number:
 Parameters
  Receive String: sIn
 Static Variables
 Local variables
 Actions
  If ( sIn )
   Return SalStrLop( sIn )
  Else
   Return 0

In TD6.3 existiert das Problem übrigens nicht.

Happy coding!

Beware of SalStrLop (in TD3.1)

If SalStrLop( sString ) is applied to an empty string then strange things can happen. This is because Gupta sets the internal buffer length to zero. When this string is concatenated to another string (say sString2) then the buffer length of sString2 will be shrinked by 1 each time. When you pass such a string to an external dll function crashes might occur because the string will be copied but only to the length of the buffer. Usually the terminating zero will then be stripped away. You get the picture.

Here is some code that shows the problem:

Set sTest = ''
Set sTest2 = 'A'
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 1 - just the trailing zero
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 2 - 'A' and trailing zero
Call SalStrLop( sTest )
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 0!
Set sTest2 = sTest2 || sTest
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 1!!

Workaround: Only apply SalStrLop when the string is not empty. Maybe write a function like this:

!!CB!! 134
Function: StrLopSafe
 Description:
 Returns
  Number:
 Parameters
  Receive String: sIn
 Static Variables
 Local variables
 Actions
  If ( sIn )
   Return SalStrLop( sIn )
  Else
   Return 0

In TD6.3 this problem does not exist.

Happy coding!