mirror of
https://github.com/ctm/executor.git
synced 2025-02-17 05:31:27 +00:00
239 lines
4.0 KiB
C
239 lines
4.0 KiB
C
typedef enum
|
|
{
|
|
handle_nil,
|
|
handle_nil_master,
|
|
handle_zero_length,
|
|
handle_valid_unlocked,
|
|
handle_valid_locked,
|
|
handle_NELEM
|
|
}
|
|
handle_state;
|
|
|
|
typedef enum
|
|
{
|
|
offset_negative,
|
|
offset_zero
|
|
offset_less_than_handle_size,
|
|
offset_handle_size,
|
|
offset_greater_than_handle_size,
|
|
offset_NELEM
|
|
}
|
|
offset_state;
|
|
|
|
typedef enum
|
|
{
|
|
ptr_nil,
|
|
ptr_valid_0,
|
|
ptr_valid_1,
|
|
ptr_valid_2,
|
|
ptr_NELEM
|
|
}
|
|
ptr_state;
|
|
|
|
typedef enum
|
|
{
|
|
len_negative,
|
|
len_zero,
|
|
len_valid,
|
|
len_NELEM
|
|
}
|
|
len_state;
|
|
|
|
static Handle
|
|
handle_from_c_string (char *str)
|
|
{
|
|
int len;
|
|
Handle retval;
|
|
|
|
len = strlen (str);
|
|
retval = NewHandle (len);
|
|
|
|
BlockMove (str, *retval, len);
|
|
|
|
return retval;
|
|
}
|
|
|
|
static Handle
|
|
new_handle (handle_state h_s)
|
|
{
|
|
Handle retval;
|
|
|
|
switch (h_s)
|
|
{
|
|
case handle_nil:
|
|
retval = 0;
|
|
break;
|
|
case handle_nil_master:
|
|
retval = NewEmptyHandle ();
|
|
break;
|
|
case handle_zero_length:
|
|
retval = NewHandle (0);
|
|
break;
|
|
case handle_valid_unlocked:
|
|
case handle_valid_locked:
|
|
retval = handle_from_c_string ("I don't repeat once. I say twice twice.");
|
|
if (h_s == handle_valid_locked)
|
|
HLock (retval);
|
|
break;
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
static LONGINT
|
|
new_offset (offset_state o_s, LONGINT hs)
|
|
{
|
|
LONGINT retval;
|
|
static int count = 0;
|
|
|
|
++count;
|
|
switch (retval)
|
|
{
|
|
case offset_negative:
|
|
retval = -count;
|
|
break;
|
|
case offset_zero:
|
|
retval = 0;
|
|
break;
|
|
case offset_less_than_handle_size:
|
|
retval = hs - 1 - (count%(hs-1)) ;
|
|
break;
|
|
case offset_handle_size:
|
|
retval = hs;
|
|
break;
|
|
case offset_greater_than_handle_size:
|
|
retval = hs + count;
|
|
break;
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
static Ptr
|
|
new_ptr (ptr_state p_s)
|
|
{
|
|
Ptr retval;
|
|
|
|
switch (p_s)
|
|
{
|
|
case ptr_nil:
|
|
retval = 0;
|
|
break;
|
|
case ptr_valid_0:
|
|
retval = "nonce";
|
|
break;
|
|
case ptr_valid_1:
|
|
retval = "once";
|
|
break;
|
|
case ptr_valid_2:
|
|
retval = "twice";
|
|
break;
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
static LONGINT
|
|
new_len (len_state l_s, LONGINT ps)
|
|
{
|
|
LONGINT retval;
|
|
|
|
switch (l_s)
|
|
{
|
|
case len_negative:
|
|
retval = -5;
|
|
break;
|
|
case len_zero:
|
|
retval = 0;
|
|
break;
|
|
case len_valid:
|
|
retval = ps;
|
|
break;
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
static void
|
|
dump_handle (Handle h)
|
|
{
|
|
SignedByte state;
|
|
LONGINT length;
|
|
|
|
state = HGetState (h);
|
|
length = GetHandleSize (h);
|
|
HLock (h);
|
|
|
|
printf ("state = 0x%x, length = %d, bytes = \"%.*s\"\n",
|
|
state, length, (int) length, *h);
|
|
|
|
HSetState (h, state);
|
|
}
|
|
|
|
static LONGINT
|
|
Munger_invoker (Handle h, LONGINT offset, Ptr ptr1, LONGINT len1,
|
|
Ptr ptr2, LONGINT len2, LONGINT *d0p)
|
|
{
|
|
LONGINT retval;
|
|
LONGINT d0_var;
|
|
|
|
retval = Munger (h, ptr1, len1, ptr2, len2);
|
|
asm { move.l d0, d0_var }
|
|
|
|
*d0p = d0_var;
|
|
|
|
return retval;
|
|
}
|
|
|
|
static void
|
|
munger_test (handle_state h_s,
|
|
offset_state offset_s,
|
|
ptr_state ptr1_s,
|
|
len_state len1_s,
|
|
ptr_state ptr2_s,
|
|
len_state len2_s)
|
|
{
|
|
Handle h;
|
|
LONGINT offset;
|
|
Ptr ptr1;
|
|
LONGINT len1;
|
|
Ptr ptr2;
|
|
LONGINT len2;
|
|
LONGINT retval;
|
|
LONGINT d0;
|
|
|
|
h = new_handle (h_s);
|
|
offset = new_offset (offset_s, GetHandleSize (h));
|
|
ptr1 = new_ptr (ptr1_s);
|
|
len1 = new_len (len1_s);
|
|
ptr2 = new_ptr (ptr2_s);
|
|
len2 = new_len (len2_s);
|
|
|
|
dump_handle (h);
|
|
retval = Munger_invoker (h, offset, ptr1, len1, ptr2, len2, &d0);
|
|
dump_handle (h);
|
|
dump_retval_d0 (retval, d0);
|
|
|
|
if (h_s >= handle_nil_master)
|
|
DisposeHandle (h);
|
|
}
|
|
|
|
static void
|
|
munger_test_all (void)
|
|
{
|
|
handle_state h_s;
|
|
offset_state offset_s;
|
|
ptr_state ptr1_s;
|
|
len_state len1_s;
|
|
ptr_state ptr2_s;
|
|
len_state len2_s;
|
|
|
|
for (h_s = 0; h_s < handle_NELEM; ++h_s)
|
|
for (offset_s = 0; offset_s < offset_NELEM; ++offset_s)
|
|
for (ptr1_s = 0; ptr1_s < ptr_NELEM; ++ptr1_s)
|
|
for (len1_s = 0; len1_s < len_NELEM; ++len1_s)
|
|
for (ptr2_s = 0; ptr2_s < ptr_NELEM; ++len2_s)
|
|
for (len2_s = 0; len2_s < len_NELEM; ++len2_s)
|
|
munger_test (h_s, offset_s, ptr1_s, len1_s, ptr2_s, len2_s);
|
|
}
|