Eric Blake wrote: > > Here's one more module in the "stdio internals" series. freadptr (stream) > > returns a pointer to the read buffer of stream. > > Nice idea - I can already envision using it in M4
Yes, me too ;-) This is what triggered me to create this API. > > fseek (fp, nl - buf + 1, SEEK_CUR); > > Not safe on pipes. Yes. I just noticed this while testing the M4 patch :-) > If fp is seekable, then this is okay. But if not, then > you'll have to actually do the fread(fp,1, nl-buf+1, <some buf>) to keep the > stdio stream in sync with what you copied into the obstack. You could > consider > using obstack_room, and if large enough, do the fread directly into > obstack_next_free, then follow up with obstack_blank_fast to get the obstack > to > recognize that you grew its contents on the side; otherwise do the fread into > a > temp buffer and obstack_copy it into the obstack which will grow > appropriately. This solution is quite M4 specific, for a problem that is more general: fseek does not work on pipes. We need a forward-seek (= read and discard) function that works all on all kinds of streams. I intend to commit tomorrow a new module that introduces this API: ========================== lib/freadseek.h ================================ /* Skipping input from a FILE stream. Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stddef.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif /* Assuming the stream STREAM is open for reading: Read and discard OFFSET bytes from STREAM. freadseek (STREAM, OFFSET) is the same as fseek (STREAM, OFFSET, SEEK_CUR), except that the latter does not work on non-seekable input (such as pipes). Upon success, return 0. Upon error, set the error indicator in the stream and return EOF. STREAM must not be wide-character oriented. */ extern int freadseek (FILE *stream, size_t offset); #ifdef __cplusplus } #endif