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

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


extern struct dbg_info* dbg_info_quick_sort;
#undef MY_TRACE_FLAG
#define MY_TRACE_FLAG quick_sort_TRACE
int quick_sort_TRACE;
extern struct OPS *int_ops;
static Vlist0 owns_quick_sort = {0, 0};

typedef struct {
int count;
} quick_sort_of_t_REQS;

quick_sort_of_t_REQS quick_sort_of_t_reqs_actual = {0};

struct REQS * quick_sort_of_t_reqs = (struct REQS *)&quick_sort_of_t_reqs_actual;


typedef struct {
    int count;
    OWNPTR type_owns;
    OWNPTR op_owns;
    } quick_sort_of_t_OPS;

extern errcode intOPadd();
extern errcode intOPsub();
extern errcode intOPle();
extern errcode intOPequal();
extern errcode arrayOPfetch();
extern errcode arrayOPaddh();
extern errcode arrayOPstore();
extern errcode arrayOPremh();
extern errcode intOPdiv();
extern errcode boolOPnot();
extern errcode quick_sort();
extern struct REQS *array_of_t_reqs;
extern OWN_req array_ownreqs;
extern struct OPS *array_ops;
extern OWN_req int_ownreqs;
extern struct REQS *quick_sort_of_t_reqs;
extern OWN_req quick_sort_ownreqs;

typedef struct {
    int quick_sort_own_init;
    quick_sort_of_t_OPS *t_ops;
    struct OPS *array_of_t_table;
    struct OPS *array_of_t_ops;
    OWNPTR array_of_t_owns;
    struct OPS *quick_sort_of_t_table;
    struct OPS *quick_sort_of_t_ops;
    OWNPTR quick_sort_of_t_owns;
    } quick_sort_OWN_DEFN;
OWN_req quick_sort_ownreqs = {sizeof(quick_sort_OWN_DEFN), 1};


/**** BEGIN PROCEDURE quick_sort ****/

errcode quick_sort(a, low, high, less, equal)
CLUREF a;
CLUREF low;
CLUREF high;
CLUREF less;
CLUREF equal;
    {
    struct {
        struct dbg_info *DBG_INFO;
        int DBG_LINE;
        errcode err;
        errcode ecode2;
        quick_sort_OWN_DEFN *op_own_ptr;
        CLUREF olow;
        CLUREF ohigh;
        CLUREF size;
        CLUREF split;
        CLUREF mid;
        CLUREF val;
        CLUREF a;
        CLUREF low;
        CLUREF high;
        CLUREF less;
        CLUREF equal;
        } locals;
    locals.olow.num = UNINIT;
    locals.ohigh.num = UNINIT;
    locals.size.num = UNINIT;
    locals.split.num = UNINIT;
    locals.mid.num = UNINIT;
    locals.val.num = UNINIT;
    locals.a.num = UNINIT;
    locals.low.num = UNINIT;
    locals.high.num = UNINIT;
    locals.less.num = UNINIT;
    locals.equal.num = UNINIT;
    locals.DBG_INFO = dbg_info_quick_sort;
    locals.a = a;
    locals.low = low;
    locals.high = high;
    locals.less = less;
    locals.equal = equal;
    locals.op_own_ptr = (quick_sort_OWN_DEFN*) CUR_PROC_VAR.proc->op_owns;
        if (locals.op_own_ptr->quick_sort_own_init == 0) {
        add_parm_info_type(0, locals.op_own_ptr->t_ops, array_of_t_reqs);
        find_type_instance(array_ops, 1, &array_ownreqs, &(locals.op_own_ptr->array_of_t_ops));
        add_parm_info_type(0, locals.op_own_ptr->t_ops, quick_sort_of_t_reqs);
        find_prociter_instance(quick_sort, 1, &quick_sort_ownreqs, &(locals.op_own_ptr->quick_sort_of_t_ops));
        }
        if (locals.op_own_ptr->quick_sort_own_init == 0) {
        locals.op_own_ptr->quick_sort_own_init = 1;
    }
    enter_proc(2);

  LINE(6);
    {
        {locals.olow.num = locals.low.num;
        }
        }

  LINE(7);
    {
        {locals.ohigh.num = locals.high.num;
        }
        }

  LINE(8);
    {
        {CLUREF T_1_1;
        CLUREF T_1_2;
        locals.err = intOPsub(locals.high, locals.low, &T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.err = intOPadd(T_1_1, CLU_1, &T_1_2);
        if (locals.err != ERR_ok) goto ex_0;
        locals.size.num = T_1_2.num;
        }
        }

  LINE(9);
    {
    CLUREF T_1_1;
    T_1_1.num = (locals.size.num <= 1)? true : false;
    if (T_1_1.num == true) {
        {
        {signal (ERR_ok);}}
        }
    else {
    CLUREF T_1_2;
    T_1_2.num = (locals.size.num == 2)? true : false;
    if (T_1_2.num == true) {

  LINE(11);
        {
        CLUREF T_2_1;
        CLUREF T_2_2;
        CLUREF T_2_3;
        locals.err = arrayOPfetch(locals.a, locals.high, &T_2_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.err = arrayOPfetch(locals.a, locals.low, &T_2_2);
        if (locals.err != ERR_ok) goto ex_0;
        CUR_PROC_VAR = locals.less;
        locals.err = locals.less.proc->proc(T_2_1, T_2_2, &T_2_3);
        if (locals.err != ERR_ok) goto ex_0;
        if (T_2_3.num == true) {

  LINE(12);
            {
            CLUREF T_3_1;
            locals.err = arrayOPfetch(locals.a, locals.low, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.err = arrayOPaddh(locals.a, T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            }

  LINE(13);
            {
            CLUREF T_3_1;
            locals.err = arrayOPfetch(locals.a, locals.high, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.err = arrayOPstore(locals.a, locals.low, T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            }

  LINE(14);
            {
            CLUREF T_3_1;
            locals.err = arrayOPremh(locals.a, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.err = arrayOPstore(locals.a, locals.high, T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            }
            }
            }/* end if */

  LINE(16);
        {
        {signal (ERR_ok);}}
        }
        }}/* end if */

  LINE(18);
    {
        {CLUREF T_1_1;
        CLUREF T_1_2;
        CLUREF T_1_3;
        locals.err = intOPdiv(locals.size, CLU_2, &T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.err = intOPadd(locals.low, T_1_1, &T_1_2);
        if (locals.err != ERR_ok) goto ex_0;
        locals.err = arrayOPfetch(locals.a, T_1_2, &T_1_3);
        if (locals.err != ERR_ok) goto ex_0;
        locals.split.num = T_1_3.num;
        }
        }

  LINE(19);
    {
        {locals.mid.num = locals.low.num;
        }
        }

  LINE(20);
    for (;;) {
        CLUREF T_1_1;
        T_1_1.num = (locals.mid.num <= locals.high.num)? true : false;
        if (T_1_1.num != true) { break; }

  LINE(21);
        {
            {CLUREF T_2_1;
            locals.err = arrayOPfetch(locals.a, locals.mid, &T_2_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.val.num = T_2_1.num;
            }
            }

  LINE(22);
        {
        CLUREF T_2_1;
        CUR_PROC_VAR = locals.less;
        locals.err = locals.less.proc->proc(locals.val, locals.split, &T_2_1);
        if (locals.err != ERR_ok) goto ex_0;
        if (T_2_1.num == true) {

  LINE(23);
            {
            CLUREF T_3_1;
            CLUREF T_3_2;
            T_3_1.num = (locals.low.num == locals.mid.num)? true : false;
            T_3_2.num = T_3_1.num ^ 1;
            if (T_3_2.num == true) {

  LINE(24);
                {
                CLUREF T_4_1;
                locals.err = arrayOPfetch(locals.a, locals.low, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPaddh(locals.a, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }

  LINE(25);
                {
                CLUREF T_4_1;
                locals.err = arrayOPfetch(locals.a, locals.mid, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPstore(locals.a, locals.low, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }

  LINE(26);
                {
                CLUREF T_4_1;
                locals.err = arrayOPremh(locals.a, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPstore(locals.a, locals.mid, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }
                }
                }/* end if */

  LINE(28);
            {
            CLUREF T_3_1;
            locals.err = intOPadd(locals.low, CLU_1, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.low.num = T_3_1.num;
            }

  LINE(29);
            {
            CLUREF T_3_1;
            locals.err = intOPadd(locals.mid, CLU_1, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.mid.num = T_3_1.num;
            }
            }
        else {
        CLUREF T_2_2;
        CUR_PROC_VAR = locals.equal;
        locals.err = locals.equal.proc->proc(locals.val, locals.split, &T_2_2);
        if (locals.err != ERR_ok) goto ex_0;
        if (T_2_2.num == true) {

  LINE(31);
            {
            CLUREF T_3_1;
            locals.err = intOPadd(locals.mid, CLU_1, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.mid.num = T_3_1.num;
            }
            }
        else {

  LINE(33);
            {
            CLUREF T_3_1;
            CLUREF T_3_2;
            T_3_1.num = (locals.mid.num == locals.high.num)? true : false;
            T_3_2.num = T_3_1.num ^ 1;
            if (T_3_2.num == true) {

  LINE(34);
                {
                CLUREF T_4_1;
                locals.err = arrayOPfetch(locals.a, locals.mid, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPaddh(locals.a, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }

  LINE(35);
                {
                CLUREF T_4_1;
                locals.err = arrayOPfetch(locals.a, locals.high, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPstore(locals.a, locals.mid, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }

  LINE(36);
                {
                CLUREF T_4_1;
                locals.err = arrayOPremh(locals.a, &T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                locals.err = arrayOPstore(locals.a, locals.high, T_4_1);
                if (locals.err != ERR_ok) goto ex_0;
                }
                }
                }/* end if */

  LINE(38);
            {
            CLUREF T_3_1;
            locals.err = intOPsub(locals.high, CLU_1, &T_3_1);
            if (locals.err != ERR_ok) goto ex_0;
            locals.high.num = T_3_1.num;
            }
            }}}/* end if */
        }
        end_while_1:;

  LINE(41);
    {
    CLUREF T_1_1;
    locals.err = intOPsub(locals.low, CLU_1, &T_1_1);
    if (locals.err != ERR_ok) goto ex_0;
    generic_CLU_proc.type_owns = 0;
    generic_CLU_proc.op_owns = (int)locals.op_own_ptr->quick_sort_of_t_ops->op_owns;
    generic_CLU_proc.proc = quick_sort;
    CUR_PROC_VAR.proc = &generic_CLU_proc;
    locals.err = quick_sort(locals.a, locals.olow, T_1_1, locals.less, locals.equal);
    if (locals.err != ERR_ok) goto ex_0;
    }

  LINE(42);
    {
    CLUREF T_1_1;
    locals.err = intOPadd(locals.high, CLU_1, &T_1_1);
    if (locals.err != ERR_ok) goto ex_0;
    generic_CLU_proc.type_owns = 0;
    generic_CLU_proc.op_owns = (int)locals.op_own_ptr->quick_sort_of_t_ops->op_owns;
    generic_CLU_proc.proc = quick_sort;
    CUR_PROC_VAR.proc = &generic_CLU_proc;
    locals.err = quick_sort(locals.a, T_1_1, locals.ohigh, locals.less, locals.equal);
    if (locals.err != ERR_ok) goto ex_0;
    }
    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 quick_sort ****/

typedef struct {
    int hdr;
    int count;
    char *name;
    char *fname;
    bool is_iter;
    int is_parmd;
    int addr;
    int nargs;
    Vlist0 *vals;
    siglist0 *sigs;
    Vlist14 *locals;
    Vlist0 *owns;
    Vlist0 *ptowns;
    Vlist8 *popowns;
    Slist0 *type_formals;
    Slist1 *op_formals;
    } dbg_info_quick_sort_actual;
static Vlist0 vals_quick_sort = {0, 0};
static siglist0 sigs_quick_sort = {0, 0};
static Vlist14 locals_quick_sort = {0, 14,{ {0, 2, "err", &int_ops},  {0, 2, "ecode2", &int_ops},  {0, 2, "op_own_ptr", &int_ops},  {0, 2, "olow", &int_ops},  {0, 2, "ohigh", &int_ops},  {0, 2, "size", &int_ops},  {0, 2, "split", zero_ops, "t_ops"},  {0, 2, "mid", &int_ops},  {0, 2, "val", zero_ops, "t_ops"},  {0, 2, "a", zero_ops, "array_of_t_ops"},  {0, 2, "low", &int_ops},  {0, 2, "high", &int_ops},  {0, 2, "less", m1_ops},  {0, 2, "equal", m1_ops}}
};
static Vlist8 popowns_quick_sort = {0, 8,{ {0, 2, "quick_sort_init", &int_ops}
, {0, 2, "t_ops", &NULL_OPS}, {0, 2, "array_of_t_table", &NULL_OPS}, {0, 2, "array_of_t_ops", &NULL_OPS}, {0, 2, "array_of_t_owns", &NULL_OPS}, {0, 2, "quick_sort_of_t_table", &NULL_OPS}, {0, 2, "quick_sort_of_t_ops", &NULL_OPS}, {0, 2, "quick_sort_of_t_owns", &NULL_OPS}}};
Slist0 tformals_quick_sort = {0, 0};
Slist1 opformals_quick_sort = {0, 1, "t"};
dbg_info_quick_sort_actual dbg_info_quick_sort_data = {0, 12, 
    "quick_sort", "/common/pub/dcurtis-temp/pclu/lib/clu/quick_sort.clu", 0, 1, (int)quick_sort, 5, 
    &vals_quick_sort, &sigs_quick_sort, &locals_quick_sort, &NO_VALS, &NO_VALS, &popowns_quick_sort, &NO_PARMS, &opformals_quick_sort};
    struct dbg_info *dbg_info_quick_sort = (struct dbg_info*)&dbg_info_quick_sort_data;
