Re: [PATCH v4 02/35] pkt-line: allow peeking a packet line without consuming it
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 1, 2018, 20:48 UTC
- Message-ID
- <xmqqk1uvfro3.fsf@gitster-ct.c.googlers.com>
- In-Reply-To
- <20180228232252.102167-3-bmwill@google.com>
Brandon Williams <bmwill@google.com> writes:
Show 31 quoted lines
> +enum packet_read_status packet_reader_read(struct packet_reader *reader)
> +{
> + if (reader->line_peeked) {
> + reader->line_peeked = 0;
> + return reader->status;
> + }
> +
> + reader->status = packet_read_with_status(reader->fd,
> + &reader->src_buffer,
> + &reader->src_len,
> + reader->buffer,
> + reader->buffer_size,
> + &reader->pktlen,
> + reader->options);
> +
> + switch (reader->status) {
> + case PACKET_READ_EOF:
> + reader->pktlen = -1;
> + reader->line = NULL;
> + break;
> + case PACKET_READ_NORMAL:
> + reader->line = reader->buffer;
> + break;
> + case PACKET_READ_FLUSH:
> + reader->pktlen = 0;
> + reader->line = NULL;
> + break;
> + }
> +
> + return reader->status;
> +}With the way _peek() interface interacts with the reader instance (which by the way I find is well designed), it is understandable that we want almost everything available in reader's fields, but having to manually clear pktlen field upon non NORMAL status feels a bit strange.
Perhaps that is because the underlying packet_read_with_status() does not set *pktlen in these cases? Shouldn't it be doing that so the caller does not have to?
A similar comment applies for reader's line field. In priniciple, as the status field is part of a reader, it does not have to exist as a separate field, i.e.
#define line_of(reader) \ ((reader).status == PACKET_READ_NORMAL ? \ (reader).buffer : NULL)
can be used to as substitute for it. I guess it depends on how the actual callers wants to use this interface.