bug-gawk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Should nextfile in BEGINFILE skip ENDFILE?


From: arnold
Subject: Re: Should nextfile in BEGINFILE skip ENDFILE?
Date: Sun, 15 Nov 2020 21:05:55 -0700
User-agent: Heirloom mailx 12.5 7/5/10

Ed Morton <mortoneccc@comcast.net> wrote:

> I thought that was just saying that given nextfile exists you could write:
>
>      BEGINFILE {
>          if ( (getline < FILENAME) < 0 ) {
>             nextfile
>          }
>      }
>
> or similar to test if you can open the current file, I didn't get that 
> the behavior would automatically change if an error occurred.
>
> I have to say I do wish that wasn't the case and nextfile simply behaved 
> the same in a BEGINFILE as anywhere else and caused ENDFILE to be 
> evaluated as it's not clear why skipping ENDFILE would always be 
> desirable,

In the case of a bad file, you'll never get to ENDFILE.

> it's not obvious why puting a nextfile in a BEGINFILE would 
> be related to handling of errors opening files, and it's easy to handle 
> errors opening files using a getline without this, e.g. if nextfile 
> behaved the same in BEGINFILE as everywhere else and I wanted to handle 
> file opening errors gracefully I could just write this clear, brief, 
> simple code:
>
>      BEGINFILE {
>          bad_file = 0
>          if ( (getline < FILENAME) < 0 ) {
>             print FILENAME, "is a bad file"
>             bad_file = 1
>             nextfile
>          }
>      }
>
>      ENDFILE {
>          if ( !bad_file ) {
>              do stuff
>          }
>      }

The point is that gawk does this for you. Your code should be

       BEGINFILE {
           if (ERRNO) {
              print FILENAME, "is a bad file"
              nextfile
           }
       }
 
       ENDFILE {
           # guaranteed if we reach here that file was good
           do stuff
       }

This is simpler.  Remember that gawk already knows if a file
it wants to open is bad or not; it gives you a hook in BEGINFILE
to deal with that if you want to, by using nextfile. If you don't
bother to deal with it, it throws a fatal error.

$ gawk 'BEGINFILE { print "before", FILENAME }' /no/such/file
before /no/such/file
gawk: cmd. line:1: fatal: cannot open file `/no/such/file' for reading: No such 
file or directory

Arnold



reply via email to

[Prev in Thread] Current Thread [Next in Thread]