Task

Write a function/procedure/subroutine that is called with an integer value and returns the middle three digits of the integer if possible or a clear indication of an error if this is not possible.

Note: The order of the middle digits should be preserved.

Your function should be tested with the following values; the first line should return valid answers, those of the second line should return clear indications of an error:

123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
1, 2, -1, -10, 2002, -2002, 0

Show your output on this page.




void
m3(integer i)
{
    text s;
 
    s = itoa(i);
    if (s[0] == '-') {
        s = delete(s, 0);
    }
 
    if (~s < 3) {
        v_integer(i);
        v_text(" has not enough digits\n");
    } elif (~s & 1) {
        o_form("/w9/: ~\n", i, cut(s, ~s - 3 >> 1, 3));
    } else {
        v_integer(i);
        v_text(" has an even number of digits\n");
    }
}
 
void
middle_3(...)
{
    integer i;
 
    i = 0;
    while (i < count()) {
        m3($i);
        i += 1;
    }
}
 
integer
main(void)
{
    middle_3(123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100,
             -12345, 1, 2, -1, -10, 2002, -2002, 0);
 
    return 0;
}