// just needed so you actually can compile this with gcc
typedef unsigned long uint64_t;

// for passing an argument and receiving a return value
uint64_t arg;

void
factorial()
{
    uint64_t n;

    n = arg;
    arg = n-1;
    if (arg == 0) {
        arg = 1;
    } else {
        factorial();
        arg = arg * n;
    }
}

void
getui()
{
    // implementation of subprogram getui
    scanf("%lu", &arg);
}

void
puts()
{
    // implementation of subprogram puts
    printf("%s", arg);
}

void
putui()
{
    // implementation of subprogram putui
    printf("%lu", arg);
}


// some string literals
char msg0[] = "n = ";
char msg1[] = "! = ";

void
main()
{
    // local variable
    uint64_t    n;

    // copy pointer to string literal to arg, call puts
    arg = msg0;
    puts();

    // call subprogram getui, copy return value to local variable
    getui();
    n = arg;

    // copy local variable to arg, call putui
    arg = n;    // could be "optimized away"
    putui();

    // copy pointer to string literal to arg, call puts
    arg = msg1;
    puts();

    // copy local n to global arg,  call subprogram factorial
    arg = n;
    factorial();

    // copy local variable to arg, call putui
    //arg = n;
    putui();

    // for convenience
    putchar('\n');
}