If you put in a Trace 'I' before your Do loop I think you will see your
dilemma.

The giveaway: Do Until is evaluated at the end of the first iteration and I
am betting you have no "level 1" in play at the time, so the PIPE gets RC
233 and the VAR FILELIST is not set.  The Do condition (or REXX) concludes
that "filelist" isn't set to zero or one, then fails.

-- *James Vincent*


On Tue, May 31, 2022 at 10:41 AM Glenn Knickerbocker <[email protected]>
wrote:

> Here's one I never noticed before.  Often I'll do something like:
>
> > Do i = 0 Until filelist | (rc ¬= 0)
> >
> >   'PIPE rexxvars' i 'nomsg233'                 ,
> >     '| take 1'                                 ,
> >     '| strfind ,s_CMS_COMMAND_FILELIST_EXEC_,' ,
> >     '| count lines'                            ,
> >     '| var filelist'                           ,
> >
> > End
>
> I just had a case where I want to know if the current exec has called
> itself, so I want to skip level 0.  I changed i=0 to i=1 in my loop, and
> ran into Error 34: Logical value not 0 or 1.  Even though the message is
> suppressed, REXXVARS (as documented) only commits to -1, the rest of the
> pipeline doesn't run, and my variable never gets set.
>
> The obvious workaround in this case is just to set my variable to 0
> before starting the loop.  If I needed to do more in the pipeline,
> though, I'd have to wrap REXXVARS in something to mask the failure.
> PREFACE seems to do the trick, by moving it into a called pipeline:
>
> > pipe preface rexxvars 1 nomsg233|count lines|cons
>
> > 0
>
> > Ready(00233);
>
>
> Actually, though, looking at the PREFACE doc, I wasn't so sure that was
> actually safe:
>
> > Commit Level:  "preface" starts on commit level -1.  The subroutine
> pipeline
> > must commit to 0 if it generates output.
>
>
> And in fact, if I leave off NOMSG233, it doesn't commit:
>
> > pipe preface rexxvars 1|count lines|cons
>
> > No active EXECCOMM environment found.
>
> > ... Processing "callpipe (name Append/Preface stagesep | escape "".
>
> > ... Issued from stage 1 of pipeline 1 name "Append/Preface".
>
> > ... Running "rexxvars 1".
>
> > Ready(00233);
>
>
> So I guess the simple, safe solution is actually APPEND, which obviously
> has to commit before it can see EOF on the input:
>
> >   'PIPE append rexxvars' i 'nomsg233'
> etc.
>
> But what's going on with PREFACE?  Does it detect whether the subroutine
> pipeline issued any messages, and commit if not?
>
> ¬R
>

Reply via email to