diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b1dcaf1510..b334164d90 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2012-12-18 Hui Zhu + + * ui-file.c (ui_file): Add to_fseek. + (ui_file_new): Call set_ui_file_fseek. + (null_file_fseek, ui_file_fseek, set_ui_file_fseek, + stdio_file_fseek): New functions. + (stdio_file_new): Call set_ui_file_fseek. + * ui-file.h (ui_file_fseek_ftype): New typedef. + (set_ui_file_fseek, ui_file_fseek): New externs. + 2012-12-18 Hui Zhu * ui-file.c (set_ui_file_flush): Change flush to flush_ptr. diff --git a/gdb/ui-file.c b/gdb/ui-file.c index 657a3fc3fe..e96ad54e97 100644 --- a/gdb/ui-file.c +++ b/gdb/ui-file.c @@ -36,6 +36,7 @@ static ui_file_flush_ftype null_file_flush; 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,14 @@ null_file_delete (struct ui_file *file) return; } +static int +null_file_fseek (struct ui_file *stream, long offset, int whence) +{ + errno = EBADF; + + return -1; +} + void * ui_file_data (struct ui_file *file) { @@ -227,6 +238,12 @@ ui_file_read (struct ui_file *file, char *buf, long length_buf) return file->to_read (file, buf, length_buf); } +int +ui_file_fseek (struct ui_file *file, long offset, int whence) +{ + return file->to_fseek (file, offset, whence); +} + void fputs_unfiltered (const char *buf, struct ui_file *file) { @@ -283,6 +300,12 @@ set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs_ptr) file->to_fputs = fputs_ptr; } +void +set_ui_file_fseek (struct ui_file *file, ui_file_fseek_ftype *fseek_ptr) +{ + file->to_fseek = fseek_ptr; +} + void set_ui_file_data (struct ui_file *file, void *data, ui_file_delete_ftype *delete_ptr) @@ -469,6 +492,7 @@ static ui_file_isatty_ftype stdio_file_isatty; 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 +523,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 +641,18 @@ stdio_file_isatty (struct ui_file *file) return (isatty (stdio->fd)); } +static int +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")); + + return fseek (stdio->file, offset, whence); +} + /* Like fdopen(). Create a ui_file from a previously opened FILE. */ struct ui_file * diff --git a/gdb/ui-file.h b/gdb/ui-file.h index a3b97da0b9..bb85713477 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -79,6 +79,11 @@ typedef void (ui_file_delete_ftype) (struct ui_file * stream); extern void set_ui_file_data (struct ui_file *stream, void *data, ui_file_delete_ftype *delete); +typedef int (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_ptr); + extern void *ui_file_data (struct ui_file *file); @@ -113,6 +118,8 @@ extern char *ui_file_obsavestring (struct ui_file *file, extern long ui_file_read (struct ui_file *file, char *buf, long length_buf); +extern int 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);