// Factorial. (2.00)
 
#include <limits.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
 
static inline _Bool mul_overflow(int a, int b, int *c)
{
    if (a != 0 && INT_MAX/a < b)
        return 1;
    *c = a*b;
    return 0;
}
 
int factorial(int n)
{
    if (n < 0)
    {
        errno = EDOM;
        return -1;
    }
 
    int result = 1;
 
    while (n > 1)
    {
        if (mul_overflow(n, result, &result))
        {
            errno = ERANGE;
            return -1;
        }
        n -= 1;
    }
    return result;
}
 
int main(void)
{
    for (int i = -1; i < 14; i++)
    {
        int result = factorial(i);
        if (result < 0)
        else
            printf("%2d! = %d\n", i
, result
);     }
    return 0;
}
				Ly8gRmFjdG9yaWFsLiAoMi4wMCkKCiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgpzdGF0aWMgaW5saW5lIF9Cb29sIG11bF9vdmVyZmxvdyhpbnQgYSwgaW50IGIsIGludCAqYykKewogICAgaWYgKGEgIT0gMCAmJiBJTlRfTUFYL2EgPCBiKQogICAgICAgIHJldHVybiAxOwogICAgKmMgPSBhKmI7CiAgICByZXR1cm4gMDsKfQoKaW50IGZhY3RvcmlhbChpbnQgbikKewogICAgaWYgKG4gPCAwKQogICAgewogICAgICAgIGVycm5vID0gRURPTTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW50IHJlc3VsdCA9IDE7CgogICAgd2hpbGUgKG4gPiAxKQogICAgewogICAgICAgIGlmIChtdWxfb3ZlcmZsb3cobiwgcmVzdWx0LCAmcmVzdWx0KSkKICAgICAgICB7CiAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIG4gLT0gMTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIGZvciAoaW50IGkgPSAtMTsgaSA8IDE0OyBpKyspCiAgICB7CiAgICAgICAgaW50IHJlc3VsdCA9IGZhY3RvcmlhbChpKTsKICAgICAgICBpZiAocmVzdWx0IDwgMCkKICAgICAgICAgICAgcHJpbnRmKCIlMmQhIDogJXNcbiIsIGksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIiUyZCEgPSAlZFxuIiwgaSwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAwOwp9