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

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


extern struct dbg_info* dbg_info_string_lindexs;
#undef MY_TRACE_FLAG
#define MY_TRACE_FLAG string_lindexs_TRACE
int string_lindexs_TRACE;
extern struct OPS *int_ops;
static Vlist1 owns_string_lindexs = {0, 1,{ {0, 2, "_init", &int_ops}
}
};
extern errcode string_lindexs_IB_1();
extern errcode string_lindexs_IB_2();
extern errcode stringOPsize();
extern errcode intOPfrom_to_by();
extern errcode intOPsub();
extern errcode boolOPnot();
extern errcode charOPequal();
extern errcode stringOPfetch();
extern errcode intOPadd();
extern OWN_req string_ownreqs;
extern struct OPS *string_ops;
static int string_lindexs_own_init = 0;

/**** BEGIN PROCEDURE string_lindexs ****/

errcode string_lindexs(pat, s, ret_1)
CLUREF pat;
CLUREF s;
CLUREF *ret_1;
    {
    struct {
        struct dbg_info *DBG_INFO;
        int DBG_LINE;
        errcode err;
        errcode ecode2;
        CLUREF z;
        CLUREF i;
        CLUREF ok;
        CLUREF j;
        CLUREF pat;
        CLUREF s;
        } locals;
    locals.z.num = UNINIT;
    locals.i.num = UNINIT;
    locals.ok.num = UNINIT;
    locals.j.num = UNINIT;
    locals.pat.num = UNINIT;
    locals.s.num = UNINIT;
    locals.DBG_INFO = dbg_info_string_lindexs;
    locals.pat = pat;
    locals.s = s;
        if (string_lindexs_own_init == 0) {
        string_lindexs_own_init = 1;
    }
    enter_proc(3);

  LINE(5);
    {
        {CLUREF T_1_1;
        locals.err = stringOPsize(locals.pat, &T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        locals.z.num = T_1_1.num;
        }
        }

  LINE(6);
    {
        CLUREF T_1_1;
        CLUREF T_1_2;
        locals.err = stringOPsize(locals.s, &T_1_1);
        if (locals.err != ERR_ok) goto ex_0;
        T_1_2.num = -1;
        locals.err = intOPfrom_to_by(T_1_1, locals.z, T_1_2, string_lindexs_IB_1, &locals, &locals.ecode2);
        if (locals.err == ERR_iterbodyreturn) {
        ret_1->num = elist[0].num;
        signal(ERR_ok);}
        if (locals.err == ERR_iterbodysignal) {signal(locals.ecode2);}
        if (locals.err == ERR_break) locals.err = ERR_ok;
        if (locals.err == ERR_iterbodyexit) locals.err = locals.ecode2;
        if (locals.err != ERR_ok) goto ex_0;
        }

  LINE(17);
    {
    {
    CLUREF T_1_1;
    CLUREF T_1_2;
    locals.err = stringOPsize(locals.s, &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;
    ret_1->num = T_1_2.num;
    }
    {signal (ERR_ok);}}
    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 string_lindexs ****/

extern struct OPS *bool_ops;
typedef struct {
    int hdr;
    int count;
    char *name;
    char *fname;
    bool is_iter;
    int is_parmd;
    int addr;
    int nargs;
    Vlist1 *vals;
    siglist0 *sigs;
    Vlist8 *locals;
    Vlist1 *owns;
    Vlist0 *ptowns;
    Vlist0 *popowns;
    Slist0 *type_formals;
    Slist0 *op_formals;
    } dbg_info_string_lindexs_actual;
static Vlist1 vals_string_lindexs = {0, 1, { {0, 2, "", &int_ops}}
};
static siglist0 sigs_string_lindexs = {0, 0};
static Vlist8 locals_string_lindexs = {0, 8,{ {0, 2, "err", &int_ops},  {0, 2, "ecode2", &int_ops},  {0, 2, "z", &int_ops},  {0, 2, "i", &int_ops},  {0, 2, "ok", &bool_ops},  {0, 2, "j", &int_ops},  {0, 2, "pat", &string_ops},  {0, 2, "s", &string_ops}}
};
static Vlist0 popowns_string_lindexs = {0, 0};
Slist0 tformals_string_lindexs = {0, 0};
Slist0 opformals_string_lindexs = {0, 0};
dbg_info_string_lindexs_actual dbg_info_string_lindexs_data = {0, 12, 
    "string_lindexs", "/common/pub/dcurtis-temp/pclu/lib/clu/string_lindexs.clu", 0, 0, (int)string_lindexs, 2, 
    &vals_string_lindexs, &sigs_string_lindexs, &locals_string_lindexs, &owns_string_lindexs, &NO_VALS, &NO_VALS, &NO_PARMS, &NO_PARMS};
    struct dbg_info *dbg_info_string_lindexs = (struct dbg_info*)&dbg_info_string_lindexs_data;

/**** BEGIN ITERATOR BODIES for string_lindexs ****/

errcode string_lindexs_IB_1(iv_1, locals, iecode)
errcode *iecode;
CLUREF iv_1;
struct {
    struct dbg_info *DBG_INFO;
    int DBG_LINE;
    errcode err;
    errcode ecode2;
    CLUREF z;
    CLUREF i;
    CLUREF ok;
    CLUREF j;
    CLUREF pat;
    CLUREF s;
    } *locals;
{
    locals->i.num = iv_1.num;
    enter_iter_body_proc(7);

  FB_LINE(7);
    {
        {locals->ok.tf = true;
        }
        }

  FB_LINE(8);
    {
        CLUREF T_1_1;
        CLUREF T_1_2;
        locals->err = intOPsub(locals->z, CLU_1, &T_1_1);
        if (locals->err != ERR_ok) goto ex_0;
        T_1_2.num = -1;
        locals->err = intOPfrom_to_by(T_1_1, CLU_0, T_1_2, string_lindexs_IB_2, locals, iecode);
        if (locals->err != ERR_ok) {
        if (locals->err == ERR_iterbodyreturn) {signal(ERR_iterbodyreturn);}
        if (locals->err == ERR_iterbodysignal) {signal(ERR_iterbodysignal);}
        if (locals->err == ERR_break) locals->err = ERR_ok;
        if (locals->err == ERR_iterbodyexit) 
        locals->err = *iecode;
        if (locals->err != ERR_ok) 
        goto ex_0;
        }
        }

  FB_LINE(14);
    {
    if (locals->ok.num == true) {

  FB_LINE(15);
        {
        {
        CLUREF T_2_1;
        CLUREF T_2_2;
        locals->err = intOPsub(locals->i, locals->z, &T_2_1);
        if (locals->err != ERR_ok) goto ex_0;
        locals->err = intOPadd(T_2_1, CLU_1, &T_2_2);
        if (locals->err != ERR_ok) goto ex_0;
        elist[0] = T_2_2;
        }
        *iecode = ERR_ok;
        {signal(ERR_iterbodyreturn);}
        }
        }
        }/* end if */
    {signal(ERR_ok);}
    ex_0:
        {
            *iecode = locals->err;
            {signal(ERR_iterbodyexit);}}
    end_0: {signal(ERR_ok);}
    }/* end string_lindexs_IB_1 */
errcode string_lindexs_IB_2(iv_1, locals, iecode)
errcode *iecode;
CLUREF iv_1;
struct {
    struct dbg_info *DBG_INFO;
    int DBG_LINE;
    errcode err;
    errcode ecode2;
    CLUREF z;
    CLUREF i;
    CLUREF ok;
    CLUREF j;
    CLUREF pat;
    CLUREF s;
    } *locals;
{
    locals->j.num = iv_1.num;
    enter_iter_body_proc(9);

  FB_LINE(9);
    {
    CLUREF T_1_1;
    CLUREF T_1_2;
    CLUREF T_1_3;
    CLUREF T_1_4;
    CLUREF T_1_5;
    CLUREF T_1_6;
    locals->err = intOPsub(locals->z, locals->j, &T_1_1);
    if (locals->err != ERR_ok) goto ex_0;
    locals->err = stringOPfetch(locals->pat, T_1_1, &T_1_2);
    if (locals->err != ERR_ok) goto ex_0;
    locals->err = intOPsub(locals->i, locals->j, &T_1_3);
    if (locals->err != ERR_ok) goto ex_0;
    locals->err = stringOPfetch(locals->s, T_1_3, &T_1_4);
    if (locals->err != ERR_ok) goto ex_0;
    T_1_5.num = (T_1_2.ch == T_1_4.ch)? true : false;
    T_1_6.num = T_1_5.num ^ 1;
    if (T_1_6.num == true) {

  FB_LINE(10);
        {
        locals->ok.tf = false;
        }

  FB_LINE(11);
        {signal(ERR_break);}
        }
        }/* end if */
    {signal(ERR_ok);}
    ex_0:
        {
            *iecode = locals->err;
            {signal(ERR_iterbodyexit);}}
    end_0: {signal(ERR_ok);}
    }/* end string_lindexs_IB_2 */

/**** END ITERATOR BODIES for string_lindexs ****/

