// Factorial.
#include <string.h>
#include <errno.h>
#include <stdio.h>
int factorial(int n)
{
if (n < 0)
{
errno = EDOM;
return -1;
}
int result = 1;
while (n > 1)
{
if (__builtin_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;
}
Ly8gRmFjdG9yaWFsLgoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgZmFjdG9yaWFsKGludCBuKQp7CiAgICBpZiAobiA8IDApCiAgICB7CiAgICAgICAgZXJybm8gPSBFRE9NOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpbnQgcmVzdWx0ID0gMTsKCiAgICB3aGlsZSAobiA+IDEpCiAgICB7CiAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobiwgcmVzdWx0LCAmcmVzdWx0KSkKICAgICAgICB7CiAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIG4gLT0gMTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIGZvciAoaW50IGkgPSAtMTsgaSA8IDE0OyBpKyspCiAgICB7CiAgICAgICAgaW50IHJlc3VsdCA9IGZhY3RvcmlhbChpKTsKICAgICAgICBpZiAocmVzdWx0IDwgMCkKICAgICAgICAgICAgcHJpbnRmKCIlMmQhIDogJXNcbiIsIGksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIiUyZCEgPSAlZFxuIiwgaSwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAwOwp9