--- a/ui-file.c +++ b/ui-file.c @@ -36,6 +36,7 @@ static ui_file_flush_ftype null_file_flu static ui_file_delete_ftype null_file_delete; static ui_file_rewind_ftype null_file_rewind; static ui_file_put_ftype null_file_put; +static ui_file_fseek_ftype null_file_fseek; struct ui_file { @@ -49,6 +50,7 @@ struct ui_file ui_file_isatty_ftype *to_isatty; ui_file_rewind_ftype *to_rewind; ui_file_put_ftype *to_put; + ui_file_fseek_ftype *to_fseek; void *to_data; }; int ui_file_magic; @@ -68,6 +70,7 @@ ui_file_new (void) set_ui_file_isatty (file, null_file_isatty); set_ui_file_rewind (file, null_file_rewind); set_ui_file_put (file, null_file_put); + set_ui_file_fseek (file, null_file_fseek); return file; } @@ -170,6 +173,12 @@ null_file_delete (struct ui_file *file) return; } +static void +null_file_fseek (struct ui_file * stream, long offset, int whence) +{ + return; +} + void * ui_file_data (struct ui_file *file) { @@ -228,6 +237,12 @@ ui_file_read (struct ui_file *file, char } void +ui_file_fseek (struct ui_file * file, long offset, int whence) +{ + file->to_fseek (file, offset, whence); +} + +void fputs_unfiltered (const char *buf, struct ui_file *file) { file->to_fputs (buf, file); @@ -284,6 +299,12 @@ set_ui_file_fputs (struct ui_file *file, } void +set_ui_file_fseek (struct ui_file *file, ui_file_fseek_ftype *fseek) +{ + file->to_fseek = fseek; +} + +void set_ui_file_data (struct ui_file *file, void *data, ui_file_delete_ftype *delete) { @@ -469,6 +490,7 @@ static ui_file_isatty_ftype stdio_file_i static ui_file_delete_ftype stdio_file_delete; static struct ui_file *stdio_file_new (FILE *file, int close_p); static ui_file_flush_ftype stdio_file_flush; +static ui_file_fseek_ftype stdio_file_fseek; static int stdio_file_magic; @@ -499,6 +521,7 @@ stdio_file_new (FILE *file, int close_p) set_ui_file_fputs (ui_file, stdio_file_fputs); set_ui_file_read (ui_file, stdio_file_read); set_ui_file_isatty (ui_file, stdio_file_isatty); + set_ui_file_fseek (ui_file, stdio_file_fseek); return ui_file; } @@ -616,6 +639,18 @@ stdio_file_isatty (struct ui_file *file) return (isatty (stdio->fd)); } +static void stdio_file_fseek (struct ui_file * file, long offset, int whence) +{ + struct stdio_file *stdio = ui_file_data (file); + + if (stdio->magic != &stdio_file_magic) + internal_error (__FILE__, __LINE__, + _("stdio_file_fseek: bad magic number")); + + if (fseek (stdio->file, offset, whence)) + error (_("fseek fail: %s"), safe_strerror (errno)); +} + /* Like fdopen(). Create a ui_file from a previously opened FILE. */ struct ui_file * --- a/ui-file.h +++ b/ui-file.h @@ -79,6 +79,11 @@ typedef void (ui_file_delete_ftype) (str extern void set_ui_file_data (struct ui_file *stream, void *data, ui_file_delete_ftype *delete); +typedef void (ui_file_fseek_ftype) (struct ui_file * stream, long offset, + int whence); +extern void set_ui_file_fseek (struct ui_file *stream, + ui_file_fseek_ftype *fseek); + extern void *ui_file_data (struct ui_file *file); @@ -113,6 +118,8 @@ extern char *ui_file_obsavestring (struc extern long ui_file_read (struct ui_file *file, char *buf, long length_buf); +extern void ui_file_fseek (struct ui_file * file, long offset, int whence); + /* Create/open a memory based file. Can be used as a scratch buffer for collecting output. */ extern struct ui_file *mem_fileopen (void);