This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: cygcheck exit status


Igor Pechtchanski <pechtcha <at> cs.nyu.edu> writes:
> > Because it's in a for loop, and when the first file fails but second
> > succeeds, you still want the overall command to exit with failure.
> 
> That's the correct intent, but shouldn't it be &&= instead of &=,
> technically?

There's no such thing as &&=.  And even if there was, you wouldn't want to use 
it, because it would short-circuit running cygcheck().  The whole point of the 
boolean collector is to run the test on every file, but to remember if any of 
the tests failed.  Maybe thinking of a short-circuit in the reverse direction 
will help you understand:

ok = cygcheck (argv[i]) && ok;

But since ok is a simple boolean, short-circuiting doesn't save us any side 
effects, so we can use:

ok = cygcheck (argv[i]) & ok;

And since & is commutative, it has the same outcome as:

ok = ok & cygcheck (argv[i]);

Hence my shorthand (coreutils uses this idiom a lot, too):

ok &= cygcheck (argv[i]);


[By deMorgan's law, I could have also reversed the sense of the collector:
bool failed = false;
for (int i; ...)
  failed |= test_that_returns_true_on_failure();
return failed ? EXIT_FAILURE : EXIT_SUCCESS;

But I hate thinking in negative logic, hence my definition of cygcheck to 
return true on success.]

--
Eric Blake



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]