Skip to content

Commit df8ca5f

Browse files
committed
com.livecode.byte: Add in-place reverse statement
Add the ability to reverse a binary string in an LCB program with a new `reverse tData` statement.
1 parent bfb6d78 commit df8ca5f

3 files changed

Lines changed: 80 additions & 0 deletions

File tree

libscript/src/byte.lcb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,37 @@ begin
432432
MCDataExecRandomBytes(Count, output)
433433
end syntax
434434

435+
--
436+
437+
public foreign handler MCDataExecReverseBytesOf(inout Target as Data) \
438+
returns nothing binds to "<builtin>"
439+
440+
/**
441+
Summary: Reverse binary data
442+
Target: A binary data string
443+
444+
Example:
445+
variable tForward
446+
put 5 random bytes into tForward
447+
448+
variable tReversed
449+
put tForward into tReversed
450+
reverse tReversed
451+
452+
expect that the first byte of tForward is the last byte of tReversed
453+
expect that the last byte of tForward is the first byte of tReversed
454+
455+
Description:
456+
Reverses the order of bytes in the <Target>.
457+
458+
Tags: Binary
459+
*/
460+
syntax ReverseBytesOf is statement
461+
"reverse" <Target: Expression>
462+
begin
463+
MCDataExecReverseBytesOf(Target)
464+
end syntax
465+
435466
----------------------------------------------------------------
436467
-- Conversion between bytes and numbers
437468
----------------------------------------------------------------

libscript/src/module-byte.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,21 @@ MCDataExecRandomBytes (uindex_t p_count, MCDataRef & r_data)
223223

224224
////////////////////////////////////////////////////////////////////////////////
225225

226+
extern "C" MC_DLLEXPORT_DEF void
227+
MCDataExecReverseBytesOf(MCDataRef &x_data)
228+
{
229+
MCAutoDataRef t_data;
230+
if (!MCDataMutableCopy(x_data, &t_data))
231+
return;
232+
if (!MCDataReverse(*t_data))
233+
return;
234+
if (!t_data.MakeImmutable())
235+
return;
236+
MCValueAssign(x_data, *t_data);
237+
}
238+
239+
////////////////////////////////////////////////////////////////////////////////
240+
226241
extern "C" MC_DLLEXPORT_DEF void
227242
MCByteEvalByteWithCode (uinteger_t p_value,
228243
MCDataRef & r_data)

tests/lcb/stdlib/byte.lcb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,40 @@ return
272272

273273
end handler
274274

275+
----------------------------------------------------------------
276+
-- Other manipulations
277+
----------------------------------------------------------------
278+
279+
public handler TestReverse()
280+
variable kFOdd
281+
put EncodeUTF8("abc") into kFOdd
282+
variable kROdd
283+
put EncodeUTF8("cba") into kROdd
284+
variable kFEven
285+
put EncodeUTF8("0123") into kFEven
286+
variable kREven
287+
put EncodeUTF8("3210") into kREven
288+
289+
variable tReversed
290+
291+
put kFOdd into tReversed
292+
reverse tReversed
293+
test "reverse in-place (odd)" when tReversed is kROdd
294+
reverse tReversed
295+
test "rereverse in-place (odd)" when tReversed is kFOdd
296+
297+
put kFEven into tReversed
298+
reverse tReversed
299+
test "reverse in-place (even)" when tReversed is kREven
300+
reverse tReversed
301+
test "rereverse in-place (even)" when tReversed is kFEven
302+
303+
put the empty data into tReversed
304+
reverse tReversed
305+
test "reverse in-place (empty)" when tReversed is empty
306+
307+
end handler
308+
275309
----------------------------------------------------------------
276310
-- Helper functions
277311
----------------------------------------------------------------

0 commit comments

Comments
 (0)