executor/src/munger_test.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);
}