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

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


extern errcode boolOPnot();
extern errcode stringOPempty();
extern errcode charOPequal();
extern errcode stringOPfetch();
extern errcode stringOPindexc();
extern errcode intOPequal();
extern errcode _home_dir();
extern errcode stringOPrest();
extern errcode stringOPconcat();
extern errcode stringOPsubstr();
extern errcode intOPsub();
extern errcode connected_dir();
extern errcode file_nameOPunparse();
extern errcode _fixup_file_name();
extern errcode file_nameOPcreate();
CLUREF STR_;
static int _working_dir_own_init = 0;
CLUREF _working_dirOPwrkdir;

/**** BEGIN PROCEDURE _working_dir ****/

errcode _working_dir(s, update, ret_1)
CLUREF s;
CLUREF update;
CLUREF *ret_1;
    {
    errcode err;
    errcode ecode2;
    CLUREF z;
        if (_working_dir_own_init == 0) {
        stringOPcons("", CLU_1, CLU_0, &STR_);
        _working_dir_own_init = 1;
        {
            {_working_dirOPwrkdir = STR_;
            }
            }
    }
    enter_proc(3);

  LINE(6);
    {
    CLUREF T_1_1;
    T_1_1.num = update.num ^ 1;
    if (T_1_1.num == true) {

  LINE(7);
        {
        {
        ret_1->num = _working_dirOPwrkdir.num;
        }
        {signal (ERR_ok);}}
        }
        }/* end if */

  LINE(8);
    {
    CLUREF T_1_1;
    err = stringOPempty(s, &T_1_1);
    if (err != ERR_ok) goto ex_0;
    if (T_1_1.num == true) {

  LINE(9);
        {
        _working_dirOPwrkdir.num = s.num;
        }

  LINE(10);
        {
        {
        ret_1->num = s.num;
        }
        {signal (ERR_ok);}}
        }
        }/* end if */

  LINE(12);
    {
    CLUREF T_1_1;
    CLUREF T_1_2;
    CLUREF T_1_3;
    err = stringOPfetch(s, CLU_1, &T_1_1);
    if (err != ERR_ok) goto ex_0;
    T_1_2.ch = '~';
    T_1_3.num = (T_1_1.ch == T_1_2.ch)? true : false;
    if (T_1_3.num == true) {

  LINE(13);
        {
            {CLUREF T_2_1;
            CLUREF T_2_2;
            T_2_1.ch = '/';
            err = stringOPindexc(T_2_1, s, &T_2_2);
            if (err != ERR_ok) goto ex_0;
            z.num = T_2_2.num;
            }
            }

  LINE(14);
        {
        CLUREF T_3_1;
        T_3_1.num = (z.num == 0)? true : false;
        if (T_3_1.num == true) {

  LINE(15);
            {
            CLUREF T_4_1;
            CLUREF T_4_2;
            err = stringOPrest(s, CLU_2, &T_4_1);
            if (err != ERR_ok) goto ex_1;
            err = _home_dir(T_4_1, &T_4_2);
            if (err != ERR_ok) goto ex_1;
            s.num = T_4_2.num;
            }
            }
        else {

  LINE(16);
            {
            CLUREF T_4_1;
            CLUREF T_4_2;
            CLUREF T_4_3;
            CLUREF T_4_4;
            CLUREF T_4_5;
            T_4_1.num = z.num - 2;
             if ((T_4_1.num >= 0 && z.num < 0 && (-2) < 0) || 
                 (T_4_1.num <= 0 && z.num > 0 && (-2) > 0)) {
                err = ERR_overflow;
                goto ex_1;}
            err = stringOPsubstr(s, CLU_2, T_4_1, &T_4_2);
            if (err != ERR_ok) goto ex_1;
            err = _home_dir(T_4_2, &T_4_3);
            if (err != ERR_ok) goto ex_1;
            err = stringOPrest(s, z, &T_4_4);
            if (err != ERR_ok) goto ex_1;
            err = stringOPconcat(T_4_3, T_4_4, &T_4_5);
            if (err != ERR_ok) goto ex_1;
            s.num = T_4_5.num;
            }
            }}/* end if */
            goto end_1;
            ex_1:
                if ((err == ERR_not_found)) {

  LINE(18);
                    {
                    {signal (ERR_bad_format);}}
                }
                else {
                    goto ex_0;
                }
            end_1:;
        }
    else {
    CLUREF T_1_4;
    CLUREF T_1_5;
    CLUREF T_1_6;
    CLUREF T_1_7;
    err = stringOPfetch(s, CLU_1, &T_1_4);
    if (err != ERR_ok) goto ex_0;
    T_1_5.ch = '/';
    T_1_6.num = (T_1_4.ch == T_1_5.ch)? true : false;
    T_1_7.num = T_1_6.num ^ 1;
    if (T_1_7.num == true) {

  LINE(20);
        {
        CLUREF T_2_1;
        err = stringOPempty(_working_dirOPwrkdir, &T_2_1);
        if (err != ERR_ok) goto ex_0;
        if (T_2_1.num == true) {

  LINE(21);
            {
            CLUREF T_3_1;
            CLUREF T_3_2;
            err = connected_dir(&T_3_1);
            if (err != ERR_ok) goto ex_0;
            err = stringOPconcat(T_3_1, s, &T_3_2);
            if (err != ERR_ok) goto ex_0;
            s.num = T_3_2.num;
            }
            }
        else {

  LINE(22);
            {
            CLUREF T_3_1;
            err = stringOPconcat(_working_dirOPwrkdir, s, &T_3_1);
            if (err != ERR_ok) goto ex_0;
            s.num = T_3_1.num;
            }
            }}/* end if */
        }
        }}/* end if */

  LINE(25);
    {
    CLUREF T_2_1;
    CLUREF T_2_2;
    CLUREF T_2_3;
    err = file_nameOPcreate(s, STR_, STR_, STR_, &T_2_1);
    if (err != ERR_ok) goto ex_2;
    err = _fixup_file_name(T_2_1, CLU_0, &T_2_2);
    if (err != ERR_ok) goto ex_2;
    err = file_nameOPunparse(T_2_2, &T_2_3);
    if (err != ERR_ok) goto ex_2;
    _working_dirOPwrkdir.num = T_2_3.num;
    }
    goto end_2;
    ex_2:
        if (err == ERR_bad_format) {signal(ERR_bad_format);}
        else {
            goto ex_0;}
    end_2:;

  LINE(29);
    {
    {
    ret_1->num = _working_dirOPwrkdir.num;
    }
    {signal (ERR_ok);}}
    goto end_0;
    ex_0:
        {
            if (err == ERR_failure) {signal(ERR_failure);}
            elist[0] = _pclu_erstr(err);
            {signal(ERR_failure);}
        }
    end_0: elist[0].str = no_return_values_STRING;
        {signal(ERR_failure);}
    }

/**** END PROCEDURE _working_dir ****/

