
/* This file was automatically generated by pclu.*/

#include "pclu_err.h"
#include "pclu_sys.h"

extern struct dbg_info* dbg_info_start_up;
#undef MY_TRACE_FLAG
#define MY_TRACE_FLAG start_up_TRACE
long start_up_TRACE;
extern struct OPS *int_ops;
static Vlist0 owns_start_up = {0, 0};
extern errcode streamOPprimary_input();
extern errcode streamOPprimary_output();
extern errcode streamOPputs();
extern errcode streamOPgetl();
extern errcode stringOPempty();
extern errcode intOPparse();
extern errcode streamOPputl();
extern errcode stringOPconcat();
extern errcode intOPunparse();
extern errcode factorial();
extern OWN_req stream_ownreqs;
extern struct OPS *stream_ops;
CLUREF STR_Enter_040an_040integer_040_050or_040RETURN_040to_040exit_051_072_040;
CLUREF STR_Illegal_040integer;
CLUREF STR__041_040_075_040;
CLUREF STR_Integer_040must_040be_040positive;
CLUREF STR_Overflow;
static int start_up_own_init = 0;

/**** BEGIN PROCEDURE start_up ****/

errcode start_up()
    {
    struct {
        struct dbg_info *DBG_INFO;
        long DBG_LINE;
        errcode err;
        errcode ecode2;
        CLUREF pi;
        CLUREF po;
        CLUREF s;
        CLUREF n;
        } locals;
    locals.pi.num = UNINIT;
    locals.po.num = UNINIT;
    locals.s.num = UNINIT;
    locals.n.num = UNINIT;
    locals.DBG_INFO = dbg_info_start_up;
        if (start_up_own_init == 0) {
        stringOPcons("Enter an integer (or RETURN to exit): ", CLU_1, CLU_38, &STR_Enter_040an_040integer_040_050or_040RETURN_040to_040exit_051_072_040);
        stringOPcons("Illegal integer", CLU_1, CLU_15, &STR_Illegal_040integer);
        stringOPcons("! = ", CLU_1, CLU_4, &STR__041_040_075_040);
        stringOPcons("Integer must be positive", CLU_1, CLU_24, &STR_Integer_040must_040be_040positive);
        stringOPcons("Overflow", CLU_1, CLU_8, &STR_Overflow);
        start_up_own_init = 1;
    }
    enter_proc(3);

  LINE(4);
    {
        {CLUREF T_1_1;
        locals.err = streamOPprimary_input(&T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.pi.num = T_1_1.num;
        }
        }

  LINE(5);
    {
        {CLUREF T_1_1;
        locals.err = streamOPprimary_output(&T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.po.num = T_1_1.num;
        }
        }

  LINE(6);
    for (;;) {
        if (true != true) { break; }

  LINE(7);
        {
        locals.err = streamOPputs(locals.po, STR_Enter_040an_040integer_040_050or_040RETURN_040to_040exit_051_072_040);
        if (locals.err != ERR_ok) goto ex_0;
        }

  LINE(8);
        {
            {CLUREF T_2_1;
            locals.err = streamOPgetl(locals.pi, &T_2_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.s.num = T_2_1.num;
            }
            }

  LINE(9);
        {
        CLUREF T_2_1;
        locals.err = stringOPempty(locals.s, &T_2_1);
        if (locals.err != ERR_ok) goto ex_0;
        if (T_2_1.num == true) {
            goto end_while_1;
            }
            }/* end if */

  LINE(10);
        {
            {CLUREF T_3_1;
            locals.err = intOPparse(locals.s, &T_3_1);
            if (locals.err != ERR_ok) goto ex_1;
            locals.n.num = T_3_1.num;
            }
            }
            goto end_1;
            ex_1:
                if ((locals.err == ERR_bad_format)) {

  LINE(12);
                    {
                    locals.err = streamOPputl(locals.po, STR_Illegal_040integer);
                    if (locals.err != ERR_ok) goto ex_0;
                    }
                }
                else {
                    goto ex_0;
                }
            end_1:;

  LINE(14);
        {
        CLUREF T_3_1;
        CLUREF T_3_2;
        CLUREF T_3_3;
        CLUREF T_3_4;
        CLUREF T_3_5;
        locals.err = intOPunparse(locals.n, &T_3_1);
        if (locals.err != ERR_ok) goto ex_2;
        locals.err = stringOPconcat(T_3_1, STR__041_040_075_040, &T_3_2);
        if (locals.err != ERR_ok) goto ex_2;
        locals.err = factorial(locals.n, &T_3_3);
        if (locals.err != ERR_ok) goto ex_2;
        locals.err = intOPunparse(T_3_3, &T_3_4);
        if (locals.err != ERR_ok) goto ex_2;
        locals.err = stringOPconcat(T_3_2, T_3_4, &T_3_5);
        if (locals.err != ERR_ok) goto ex_2;
        locals.err = streamOPputl(locals.po, T_3_5);
        if (locals.err != ERR_ok) goto ex_2;
        }
            goto end_2;
            ex_2:
                if (errcmp(locals.err, "ERR_negative")) {

  LINE(16);
                    {
                    locals.err = streamOPputl(locals.po, STR_Integer_040must_040be_040positive);
                    if (locals.err != ERR_ok) goto ex_0;
                    }
                }
                else if ((locals.err == ERR_overflow)) {

  LINE(18);
                    {
                    locals.err = streamOPputl(locals.po, STR_Overflow);
                    if (locals.err != ERR_ok) goto ex_0;
                    }
                }
                else {
                    goto ex_0;
                }
            end_2:;
        }
        end_while_1:;
    goto end_0;
    ex_0:
        {
            if (locals.err == ERR_failure) {signal(ERR_failure);}
            elist[0] = _pclu_erstr(locals.err);
            {signal(ERR_failure);}
        }
    end_0: {signal(ERR_ok);}
    }

/**** END PROCEDURE start_up ****/

extern struct OPS *string_ops;
typedef struct {
    long hdr;
    long count;
    char *name;
    char *fname;
    bool is_iter;
    long is_parmd;
    long addr;
    long nargs;
    Vlist0 *vals;
    siglist0 *sigs;
    Vlist6 *locals;
    Vlist0 *owns;
    Vlist0 *ptowns;
    Vlist0 *popowns;
    Slist0 *type_formals;
    Slist0 *op_formals;
    } dbg_info_start_up_actual;
static Vlist0 vals_start_up = {0, 0};
static siglist0 sigs_start_up = {0, 0};
static Vlist6 locals_start_up = {0, 6,{ {0, 2, "err", &int_ops},  {0, 2, "ecode2", &int_ops},  {0, 2, "pi", &stream_ops},  {0, 2, "po", &stream_ops},  {0, 2, "s", &string_ops},  {0, 2, "n", &int_ops}}
};
static Vlist0 popowns_start_up = {0, 0};
Slist0 tformals_start_up = {0, 0};
Slist0 opformals_start_up = {0, 0};
dbg_info_start_up_actual dbg_info_start_up_data = {0, 12, 
    "start_up", "/usr/scratch/clu/example-debug/factorial.clu", 0, 0, (long)start_up, 0, 
    &vals_start_up, &sigs_start_up, &locals_start_up, &owns_start_up, &NO_VALS, &NO_VALS, &NO_PARMS, &NO_PARMS};
    struct dbg_info *dbg_info_start_up = (struct dbg_info*)&dbg_info_start_up_data;

extern struct dbg_info* dbg_info_factorial;
#undef MY_TRACE_FLAG
#define MY_TRACE_FLAG factorial_TRACE
long factorial_TRACE;
static Vlist1 owns_factorial = {0, 1,{ {0, 2, "_init", &int_ops}
}
};
extern errcode intOPlt();
extern errcode intOPequal();
extern errcode intOPmul();
extern errcode intOPsub();
extern OWN_req int_ownreqs;
static int factorial_own_init = 0;

/**** BEGIN PROCEDURE factorial ****/

errcode factorial(n, ret_1)
CLUREF n;
CLUREF *ret_1;
    {
    struct {
        struct dbg_info *DBG_INFO;
        long DBG_LINE;
        errcode err;
        errcode ecode2;
        CLUREF n;
        } locals;
    locals.n.num = UNINIT;
    locals.DBG_INFO = dbg_info_factorial;
    locals.n = n;
        if (factorial_own_init == 0) {
        factorial_own_init = 1;
    }
    enter_proc(23);

  LINE(24);
    {
    CLUREF T_1_1;
    T_1_1.num = (locals.n.num < 0)? true : false;
    if (T_1_1.num == true) {
        {
        {signal ("ERR_negative");}}
        }
        }/* end if */

  LINE(25);
    {
    CLUREF T_1_1;
    T_1_1.num = (locals.n.num == 0)? true : false;
    if (T_1_1.num == true) {
        {
        {
        ret_1->num = 1;
        }
        {signal (ERR_ok);}}
        }
        }/* end if */

  LINE(26);
    {
    {
    CLUREF T_2_1;
    CLUREF T_2_2;
    CLUREF T_2_3;
    locals.err = intOPsub(locals.n, CLU_1, &T_2_1);
    if (locals.err != ERR_ok) goto ex_1;
    locals.err = factorial(T_2_1, &T_2_2);
    if (locals.err != ERR_ok) goto ex_1;
    locals.err = intOPmul(locals.n, T_2_2, &T_2_3);
    if (locals.err != ERR_ok) goto ex_1;
    ret_1->num = T_2_3.num;
    }
    {signal (ERR_ok);}}
    goto end_1;
    ex_1:
        if (locals.err == ERR_overflow) {signal(ERR_overflow);}
        else {
            goto ex_0;}
    end_1:;
    goto end_0;
    ex_0:
        {
            if (locals.err == ERR_failure) {signal(ERR_failure);}
            elist[0] = _pclu_erstr(locals.err);
            {signal(ERR_failure);}
        }
    end_0: elist[0].str = no_return_values_STRING;
        {signal(ERR_failure);}
    }

/**** END PROCEDURE factorial ****/

typedef struct {
    long hdr;
    long count;
    char *name;
    char *fname;
    bool is_iter;
    long is_parmd;
    long addr;
    long nargs;
    Vlist1 *vals;
    siglist2 *sigs;
    Vlist3 *locals;
    Vlist1 *owns;
    Vlist0 *ptowns;
    Vlist0 *popowns;
    Slist0 *type_formals;
    Slist0 *op_formals;
    } dbg_info_factorial_actual;
static Vlist1 vals_factorial = {0, 1, { {0, 2, "", &int_ops}}
};
static sig_desc0 sig_factorial_1 = {0, 3, "negative", {0, 0
}};
static sig_desc0 sig_factorial_2 = {0, 3, "overflow", {0, 0
}};
static siglist2 sigs_factorial = {0, 2, (sig_desc*)&sig_factorial_1, (sig_desc*)&sig_factorial_2};
static Vlist3 locals_factorial = {0, 3,{ {0, 2, "err", &int_ops},  {0, 2, "ecode2", &int_ops},  {0, 2, "n", &int_ops}}
};
static Vlist0 popowns_factorial = {0, 0};
Slist0 tformals_factorial = {0, 0};
Slist0 opformals_factorial = {0, 0};
dbg_info_factorial_actual dbg_info_factorial_data = {0, 12, 
    "factorial", "/usr/scratch/clu/example-debug/factorial.clu", 0, 0, (long)factorial, 1, 
    &vals_factorial, &sigs_factorial, &locals_factorial, &owns_factorial, &NO_VALS, &NO_VALS, &NO_PARMS, &NO_PARMS};
    struct dbg_info *dbg_info_factorial = (struct dbg_info*)&dbg_info_factorial_data;
