* [PATCH] Add fseek to ui-file
@ 2012-12-06 9:46 Hui Zhu
2012-12-06 21:48 ` Tom Tromey
0 siblings, 1 reply; 21+ messages in thread
From: Hui Zhu @ 2012-12-06 9:46 UTC (permalink / raw)
To: Tom Tromey, gdb-patches ml; +Cc: Hui Zhu
[-- Attachment #1: Type: text/plain, Size: 802 bytes --]
Hi Tom,
According to your comments in "[PATCH] Add CTF support to GDB [1/4]
Add "-ctf" to tsave command".
I make this patch to add fseek to ui-file. Please help me review it.
And stdio_file_fseek has a place different from the other stdio_file
functions. It check the return of fseek. If it got error, it will
throw error.
If you think it is OK, I will post patch for other stdio_file functions.
If not, it will update this patch.
Thanks,
Hui
2012-12-06 Hui Zhu <hui_zhu@mentor.com>
* 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.
[-- Attachment #2: ui-file-fseek.txt --]
[-- Type: text/plain, Size: 3516 bytes --]
--- 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);
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH] Add fseek to ui-file 2012-12-06 9:46 [PATCH] Add fseek to ui-file Hui Zhu @ 2012-12-06 21:48 ` Tom Tromey 2012-12-07 8:02 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-06 21:48 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> And stdio_file_fseek has a place different from the other stdio_file Hui> functions. It check the return of fseek. If it got error, it will Hui> throw error. Hui> If you think it is OK, I will post patch for other stdio_file functions. Hui> If not, it will update this patch. Thanks. Hui> void Hui> +set_ui_file_fseek (struct ui_file *file, ui_file_fseek_ftype *fseek) Hui> +{ Hui> + file->to_fseek = fseek; I found the argument name 'fseek' confusing here, since this mimics a global function of the same name. Could you rename the argument? Hui> +static void stdio_file_fseek (struct ui_file * file, long offset, int whence) Hui> +{ Newline after 'void'. I wonder whether the null fseek ought to unconditionally throw an exception. It seems to me that it can't really be successful. I think this should go in conditionally based on the other patches -- no need to put it in if it turns out you can't use ui_file after all for some reason. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-06 21:48 ` Tom Tromey @ 2012-12-07 8:02 ` Hui Zhu 2012-12-07 9:56 ` Pedro Alves 2012-12-07 14:49 ` Tom Tromey 0 siblings, 2 replies; 21+ messages in thread From: Hui Zhu @ 2012-12-07 8:02 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 1782 bytes --] On Fri, Dec 7, 2012 at 5:48 AM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> And stdio_file_fseek has a place different from the other stdio_file > Hui> functions. It check the return of fseek. If it got error, it will > Hui> throw error. > Hui> If you think it is OK, I will post patch for other stdio_file functions. > Hui> If not, it will update this patch. > > Thanks. > > Hui> void > Hui> +set_ui_file_fseek (struct ui_file *file, ui_file_fseek_ftype *fseek) > Hui> +{ > Hui> + file->to_fseek = fseek; > > I found the argument name 'fseek' confusing here, since this mimics a > global function of the same name. Could you rename the argument? OK. Fixed. And I found all other set_ui_file_xxx functions have this issue, do you mind I post a patch to update them? > > Hui> +static void stdio_file_fseek (struct ui_file * file, long offset, int whence) > Hui> +{ > > Newline after 'void'. Fixed. > > I wonder whether the null fseek ought to unconditionally throw an > exception. It seems to me that it can't really be successful. > > I think this should go in conditionally based on the other patches -- no > need to put it in if it turns out you can't use ui_file after all for > some reason. > I will post another patch for it later. What about let it throw a internal_error. > Tom The attachment is the new patch. Please help me review it. Thanks, Hui 2012-12-07 Hui Zhu <hui_zhu@mentor.com> * 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. [-- Attachment #2: ui-file-fseek.txt --] [-- Type: text/plain, Size: 3521 bytes --] --- 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_p) +{ + file->to_fseek = fseek_p; +} + +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,19 @@ 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); ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-07 8:02 ` Hui Zhu @ 2012-12-07 9:56 ` Pedro Alves 2012-12-10 10:48 ` Hui Zhu 2012-12-07 14:49 ` Tom Tromey 1 sibling, 1 reply; 21+ messages in thread From: Pedro Alves @ 2012-12-07 9:56 UTC (permalink / raw) To: Hui Zhu; +Cc: Tom Tromey, gdb-patches ml, Hui Zhu On 12/07/2012 08:01 AM, Hui Zhu wrote: > +ui_file_fseek (struct ui_file * file, long offset, int whence) No space after '*'. Several instances of this issue in the patch. On 12/07/2012 08:01 AM, Hui Zhu wrote: > +static void > +stdio_file_fseek (struct ui_file * file, long offset, int whence) > +{ ... > + if (fseek (stdio->file, offset, whence)) > + error (_("fseek fail: %s"), safe_strerror (errno)); I think that if we want to support error handling, then this should return the fseek result to the caller instead of throwing an exception. See e.g., the comment in stdio_file_write. -- Pedro Alves ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-07 9:56 ` Pedro Alves @ 2012-12-10 10:48 ` Hui Zhu 2012-12-10 19:54 ` Tom Tromey 0 siblings, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-10 10:48 UTC (permalink / raw) To: Pedro Alves; +Cc: Tom Tromey, gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 1282 bytes --] On Fri, Dec 7, 2012 at 5:56 PM, Pedro Alves <palves@redhat.com> wrote: > On 12/07/2012 08:01 AM, Hui Zhu wrote: >> +ui_file_fseek (struct ui_file * file, long offset, int whence) > > No space after '*'. Several instances of this issue in the patch. Fixed. > > On 12/07/2012 08:01 AM, Hui Zhu wrote: >> +static void >> +stdio_file_fseek (struct ui_file * file, long offset, int whence) >> +{ > ... >> + if (fseek (stdio->file, offset, whence)) >> + error (_("fseek fail: %s"), safe_strerror (errno)); > > I think that if we want to support error handling, then this should > return the fseek result to the caller instead of throwing an exception. > See e.g., the comment in stdio_file_write. > What about I change error to warning? Then it don't need some handle and something. And if really got some issue with this syscall, user can find issue with this warning? > -- > Pedro Alves > Post a new version. Thanks, Hui 2012-12-10 Hui Zhu <hui_zhu@mentor.com> * 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. [-- Attachment #2: ui-file-fseek.txt --] [-- Type: text/plain, Size: 3520 bytes --] --- 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_p) +{ + file->to_fseek = fseek_p; +} + +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,19 @@ 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)) + warning (_("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); ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-10 10:48 ` Hui Zhu @ 2012-12-10 19:54 ` Tom Tromey 2012-12-11 10:35 ` Pedro Alves 0 siblings, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-10 19:54 UTC (permalink / raw) To: Hui Zhu; +Cc: Pedro Alves, gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Pedro> I think that if we want to support error handling, then this should Pedro> return the fseek result to the caller instead of throwing an exception. Pedro> See e.g., the comment in stdio_file_write. I wonder whether that comment is correct. Hui> What about I change error to warning? Hui> Then it don't need some handle and something. And if really got some Hui> issue with this syscall, user can find issue with this warning? I think that would be a worse solution. It would mean the writing would continue even after failing. Better to do what Pedro asks. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-10 19:54 ` Tom Tromey @ 2012-12-11 10:35 ` Pedro Alves 2012-12-11 14:35 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Pedro Alves @ 2012-12-11 10:35 UTC (permalink / raw) To: Tom Tromey; +Cc: Hui Zhu, gdb-patches ml, Hui Zhu On 12/10/2012 07:54 PM, Tom Tromey wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Pedro> I think that if we want to support error handling, then this should > Pedro> return the fseek result to the caller instead of throwing an exception. > Pedro> See e.g., the comment in stdio_file_write. > > I wonder whether that comment is correct. http://sourceware.org/ml/gdb-patches/2008-12/msg00260.html And if that didn't crash that way, I think we'd end up with infinite recursion: error -> ui-file (output exception text) -> that fails -> error -> ui-file (output exception text) -> that fails ... -- Pedro Alves ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-11 10:35 ` Pedro Alves @ 2012-12-11 14:35 ` Hui Zhu 2012-12-11 14:39 ` Pedro Alves 0 siblings, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-11 14:35 UTC (permalink / raw) To: Pedro Alves; +Cc: Tom Tromey, gdb-patches ml, Hui Zhu On Tue, Dec 11, 2012 at 6:35 PM, Pedro Alves <palves@redhat.com> wrote: > On 12/10/2012 07:54 PM, Tom Tromey wrote: >>>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: >> >> Pedro> I think that if we want to support error handling, then this should >> Pedro> return the fseek result to the caller instead of throwing an exception. >> Pedro> See e.g., the comment in stdio_file_write. >> >> I wonder whether that comment is correct. > > http://sourceware.org/ml/gdb-patches/2008-12/msg00260.html > > And if that didn't crash that way, I think we'd end up with > infinite recursion: > > error > -> ui-file (output exception text) > -> that fails > -> error > -> ui-file (output exception text) > -> that fails > ... > > -- > Pedro Alves > What about add a flag to struct stdio_file to record the error in this fd. When stdio_file_xxx get error, set it and throw error. Each stdio_file_xxx function check this flag before do syscall. If this fd get error, just return. Then stdio_file_xxx can throw error. Thanks, Hui ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-11 14:35 ` Hui Zhu @ 2012-12-11 14:39 ` Pedro Alves 2012-12-11 14:58 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Pedro Alves @ 2012-12-11 14:39 UTC (permalink / raw) To: Hui Zhu; +Cc: Tom Tromey, gdb-patches ml, Hui Zhu On 12/11/2012 02:34 PM, Hui Zhu wrote: > What about add a flag to struct stdio_file to record the error in this fd. > When stdio_file_xxx get error, set it and throw error. > Each stdio_file_xxx function check this flag before do syscall. If > this fd get error, just return. That would allow the second caller to proceed as if no error had happened. That's not a good interface. -- Pedro Alves ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-11 14:39 ` Pedro Alves @ 2012-12-11 14:58 ` Hui Zhu 0 siblings, 0 replies; 21+ messages in thread From: Hui Zhu @ 2012-12-11 14:58 UTC (permalink / raw) To: Pedro Alves; +Cc: Tom Tromey, gdb-patches ml, Hui Zhu On Tue, Dec 11, 2012 at 10:39 PM, Pedro Alves <palves@redhat.com> wrote: > On 12/11/2012 02:34 PM, Hui Zhu wrote: > >> What about add a flag to struct stdio_file to record the error in this fd. >> When stdio_file_xxx get error, set it and throw error. >> Each stdio_file_xxx function check this flag before do syscall. If >> this fd get error, just return. > > That would allow the second caller to proceed as if no error > had happened. That's not a good interface. > > -- > Pedro Alves > What about change it to if flag is set, not do anything like current what we do. If not, throw error. For example: if (write (stdio->fd, buf, length_buf) < 0) { if (!stdio->error_throwed) { stdio->error_throwed = 1; error(xxx); } } No infinite recursion. Thanks, Hui ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-07 8:02 ` Hui Zhu 2012-12-07 9:56 ` Pedro Alves @ 2012-12-07 14:49 ` Tom Tromey 2012-12-10 10:57 ` Hui Zhu 1 sibling, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-07 14:49 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> And I found all other set_ui_file_xxx functions have this issue, do Hui> you mind I post a patch to update them? I think it would be fine. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-07 14:49 ` Tom Tromey @ 2012-12-10 10:57 ` Hui Zhu 2012-12-10 19:55 ` Tom Tromey 0 siblings, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-10 10:57 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 861 bytes --] On Fri, Dec 7, 2012 at 10:49 PM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> And I found all other set_ui_file_xxx functions have this issue, do > Hui> you mind I post a patch to update them? > > I think it would be fine. > > Tom Post a patch for that. Please help me review it. Thanks, Hui 2012-12-10 Hui Zhu <hui_zhu@mentor.com> * ui-file.c (set_ui_file_flush): Change flush to flush_p. (set_ui_file_isatty): Change isatty to isatty_p. (set_ui_file_rewind): Change rewind to rewind_p. (set_ui_file_put): Change put to put_p. (set_ui_file_write): Change write to write_p. (set_ui_file_write_async_safe): Change write_async_safe to write_async_safe_p. (set_ui_file_read): Change read to read_p. (set_ui_file_fputs): Change fputs to fputs_p. (set_ui_file_data): Change delete to delete_p. [-- Attachment #2: ui-file-change-arg.txt --] [-- Type: text/plain, Size: 2129 bytes --] --- a/ui-file.c +++ b/ui-file.c @@ -234,61 +234,61 @@ fputs_unfiltered (const char *buf, struc } void -set_ui_file_flush (struct ui_file *file, ui_file_flush_ftype *flush) +set_ui_file_flush (struct ui_file *file, ui_file_flush_ftype *flush_p) { - file->to_flush = flush; + file->to_flush = flush_p; } void -set_ui_file_isatty (struct ui_file *file, ui_file_isatty_ftype *isatty) +set_ui_file_isatty (struct ui_file *file, ui_file_isatty_ftype *isatty_p) { - file->to_isatty = isatty; + file->to_isatty = isatty_p; } void -set_ui_file_rewind (struct ui_file *file, ui_file_rewind_ftype *rewind) +set_ui_file_rewind (struct ui_file *file, ui_file_rewind_ftype *rewind_p) { - file->to_rewind = rewind; + file->to_rewind = rewind_p; } void -set_ui_file_put (struct ui_file *file, ui_file_put_ftype *put) +set_ui_file_put (struct ui_file *file, ui_file_put_ftype *put_p) { - file->to_put = put; + file->to_put = put_p; } void set_ui_file_write (struct ui_file *file, - ui_file_write_ftype *write) + ui_file_write_ftype *write_p) { - file->to_write = write; + file->to_write = write_p; } void set_ui_file_write_async_safe (struct ui_file *file, - ui_file_write_async_safe_ftype *write_async_safe) + ui_file_write_async_safe_ftype *write_async_safe_p) { - file->to_write_async_safe = write_async_safe; + file->to_write_async_safe = write_async_safe_p; } void -set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read) +set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read_p) { - file->to_read = read; + file->to_read = read_p; } void -set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs) +set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs_p) { - file->to_fputs = fputs; + file->to_fputs = fputs_p; } void set_ui_file_data (struct ui_file *file, void *data, - ui_file_delete_ftype *delete) + ui_file_delete_ftype *delete_p) { file->to_data = data; - file->to_delete = delete; + file->to_delete = delete_p; } /* ui_file utility function for converting a ``struct ui_file'' into ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-10 10:57 ` Hui Zhu @ 2012-12-10 19:55 ` Tom Tromey 2012-12-11 7:22 ` Hui Zhu 2012-12-12 11:01 ` Hui Zhu 0 siblings, 2 replies; 21+ messages in thread From: Tom Tromey @ 2012-12-10 19:55 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> Post a patch for that. Please help me review it. I think _p is not a super choice for a suffix. It already has a meaning in gdb. "_ptr" or most anything else would be better. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-10 19:55 ` Tom Tromey @ 2012-12-11 7:22 ` Hui Zhu 2012-12-12 11:01 ` Hui Zhu 1 sibling, 0 replies; 21+ messages in thread From: Hui Zhu @ 2012-12-11 7:22 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 915 bytes --] On Tue, Dec 11, 2012 at 3:55 AM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> Post a patch for that. Please help me review it. > > I think _p is not a super choice for a suffix. > It already has a meaning in gdb. > "_ptr" or most anything else would be better. > > Tom Post a new version. Please help me review it. Thanks, Hui 2012-12-11 Hui Zhu <hui_zhu@mentor.com> * ui-file.c (set_ui_file_flush): Change flush to flush_ptr. (set_ui_file_isatty): Change isatty to isatty_ptr. (set_ui_file_rewind): Change rewind to rewind_ptr. (set_ui_file_put): Change put to put_ptr. (set_ui_file_write): Change write to write_ptr. (set_ui_file_write_async_safe): Change write_async_safe to write_async_safe_ptr. (set_ui_file_read): Change read to read_ptr. (set_ui_file_fputs): Change fputs to fputs_ptr. (set_ui_file_data): Change delete to delete_ptr. [-- Attachment #2: ui-file-change-arg.txt --] [-- Type: text/plain, Size: 2165 bytes --] --- a/ui-file.c +++ b/ui-file.c @@ -234,61 +234,61 @@ fputs_unfiltered (const char *buf, struc } void -set_ui_file_flush (struct ui_file *file, ui_file_flush_ftype *flush) +set_ui_file_flush (struct ui_file *file, ui_file_flush_ftype *flush_ptr) { - file->to_flush = flush; + file->to_flush = flush_ptr; } void -set_ui_file_isatty (struct ui_file *file, ui_file_isatty_ftype *isatty) +set_ui_file_isatty (struct ui_file *file, ui_file_isatty_ftype *isatty_ptr) { - file->to_isatty = isatty; + file->to_isatty = isatty_ptr; } void -set_ui_file_rewind (struct ui_file *file, ui_file_rewind_ftype *rewind) +set_ui_file_rewind (struct ui_file *file, ui_file_rewind_ftype *rewind_ptr) { - file->to_rewind = rewind; + file->to_rewind = rewind_ptr; } void -set_ui_file_put (struct ui_file *file, ui_file_put_ftype *put) +set_ui_file_put (struct ui_file *file, ui_file_put_ftype *put_ptr) { - file->to_put = put; + file->to_put = put_ptr; } void set_ui_file_write (struct ui_file *file, - ui_file_write_ftype *write) + ui_file_write_ftype *write_ptr) { - file->to_write = write; + file->to_write = write_ptr; } void set_ui_file_write_async_safe (struct ui_file *file, - ui_file_write_async_safe_ftype *write_async_safe) + ui_file_write_async_safe_ftype *write_async_safe_ptr) { - file->to_write_async_safe = write_async_safe; + file->to_write_async_safe = write_async_safe_ptr; } void -set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read) +set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read_ptr) { - file->to_read = read; + file->to_read = read_ptr; } void -set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs) +set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs_ptr) { - file->to_fputs = fputs; + file->to_fputs = fputs_ptr; } void set_ui_file_data (struct ui_file *file, void *data, - ui_file_delete_ftype *delete) + ui_file_delete_ftype *delete_ptr) { file->to_data = data; - file->to_delete = delete; + file->to_delete = delete_ptr; } /* ui_file utility function for converting a ``struct ui_file'' into ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-10 19:55 ` Tom Tromey 2012-12-11 7:22 ` Hui Zhu @ 2012-12-12 11:01 ` Hui Zhu 2012-12-12 15:38 ` Tom Tromey 1 sibling, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-12 11:01 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 737 bytes --] On Tue, Dec 11, 2012 at 3:55 AM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> Post a patch for that. Please help me review it. > > I think _p is not a super choice for a suffix. > It already has a meaning in gdb. > "_ptr" or most anything else would be better. > > Tom Post a new version. Please help me review it. Best, Hui 2012-12-12 Hui Zhu <hui_zhu@mentor.com> * 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. [-- Attachment #2: ui-file-fseek.txt --] [-- Type: text/plain, Size: 3498 bytes --] --- 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 int +null_file_fseek (struct ui_file *stream, long offset, int whence) +{ + return 0; +} + void * ui_file_data (struct ui_file *file) { @@ -227,6 +236,12 @@ ui_file_read (struct ui_file *file, char 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) { @@ -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_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 +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 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 * --- 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 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 (struc 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); ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-12 11:01 ` Hui Zhu @ 2012-12-12 15:38 ` Tom Tromey 2012-12-13 1:45 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-12 15:38 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> +static int Hui> +null_file_fseek (struct ui_file *stream, long offset, int whence) Hui> +{ Hui> + return 0; Hui> +} Why does this return success rather than error? It seems strange to report success when nothing actually happens. Hui> +typedef int (ui_file_fseek_ftype) (struct ui_file * stream, long offset, Hui> + int whence); Extra space after "*". Hui> +extern int ui_file_fseek (struct ui_file * file, long offset, int whence); Here too. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-12 15:38 ` Tom Tromey @ 2012-12-13 1:45 ` Hui Zhu 2012-12-14 19:18 ` Tom Tromey 0 siblings, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-13 1:45 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 1061 bytes --] On Wed, Dec 12, 2012 at 11:38 PM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> +static int > Hui> +null_file_fseek (struct ui_file *stream, long offset, int whence) > Hui> +{ > Hui> + return 0; > Hui> +} > > Why does this return success rather than error? > It seems strange to report success when nothing actually happens. > > Hui> +typedef int (ui_file_fseek_ftype) (struct ui_file * stream, long offset, > Hui> + int whence); > > Extra space after "*". > > Hui> +extern int ui_file_fseek (struct ui_file * file, long offset, int whence); > > Here too. > > Tom Post a new version according to your comments. Thanks, Hui 2012-12-13 Hui Zhu <hui_zhu@mentor.com> * 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. [-- Attachment #2: ui-file-fseek.txt --] [-- Type: text/plain, Size: 3497 bytes --] --- 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 int +null_file_fseek (struct ui_file *stream, long offset, int whence) +{ + return -1; +} + void * ui_file_data (struct ui_file *file) { @@ -227,6 +236,12 @@ ui_file_read (struct ui_file *file, char 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) { @@ -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_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 +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 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 * --- 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 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 (struc 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); ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-13 1:45 ` Hui Zhu @ 2012-12-14 19:18 ` Tom Tromey 2012-12-17 3:00 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-14 19:18 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> +static int Hui> +null_file_fseek (struct ui_file *stream, long offset, int whence) Hui> +{ Hui> + return -1; Hui> +} It seems like this should set errno as well. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-14 19:18 ` Tom Tromey @ 2012-12-17 3:00 ` Hui Zhu 2012-12-17 20:04 ` Tom Tromey 0 siblings, 1 reply; 21+ messages in thread From: Hui Zhu @ 2012-12-17 3:00 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu [-- Attachment #1: Type: text/plain, Size: 435 bytes --] On Sat, Dec 15, 2012 at 3:18 AM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> +static int > Hui> +null_file_fseek (struct ui_file *stream, long offset, int whence) > Hui> +{ > Hui> + return -1; > Hui> +} > > It seems like this should set errno as well. > > Tom OK. Set errno to EBADF in new patch because its means "The stream specified is not a seekable stream". Thanks, Hui [-- Attachment #2: ui-file-fseek.txt --] [-- Type: text/plain, Size: 3517 bytes --] --- 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,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 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) { @@ -284,6 +301,12 @@ set_ui_file_fputs (struct ui_file *file, } 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_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 +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 * --- 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 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 (struc 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); ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-17 3:00 ` Hui Zhu @ 2012-12-17 20:04 ` Tom Tromey 2012-12-18 7:03 ` Hui Zhu 0 siblings, 1 reply; 21+ messages in thread From: Tom Tromey @ 2012-12-17 20:04 UTC (permalink / raw) To: Hui Zhu; +Cc: gdb-patches ml, Hui Zhu >>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: Hui> OK. Set errno to EBADF in new patch because its means "The stream Hui> specified is not a seekable stream". Thank you. This is ok. Tom ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] Add fseek to ui-file 2012-12-17 20:04 ` Tom Tromey @ 2012-12-18 7:03 ` Hui Zhu 0 siblings, 0 replies; 21+ messages in thread From: Hui Zhu @ 2012-12-18 7:03 UTC (permalink / raw) To: Tom Tromey; +Cc: gdb-patches ml, Hui Zhu On Tue, Dec 18, 2012 at 4:04 AM, Tom Tromey <tromey@redhat.com> wrote: >>>>>> "Hui" == Hui Zhu <teawater@gmail.com> writes: > > Hui> OK. Set errno to EBADF in new patch because its means "The stream > Hui> specified is not a seekable stream". > > Thank you. > This is ok. > > Tom Thanks for your help. Checked in. http://sourceware.org/ml/gdb-cvs/2012-12/msg00135.html Best, Hui ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2012-12-18 7:03 UTC | newest] Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-12-06 9:46 [PATCH] Add fseek to ui-file Hui Zhu 2012-12-06 21:48 ` Tom Tromey 2012-12-07 8:02 ` Hui Zhu 2012-12-07 9:56 ` Pedro Alves 2012-12-10 10:48 ` Hui Zhu 2012-12-10 19:54 ` Tom Tromey 2012-12-11 10:35 ` Pedro Alves 2012-12-11 14:35 ` Hui Zhu 2012-12-11 14:39 ` Pedro Alves 2012-12-11 14:58 ` Hui Zhu 2012-12-07 14:49 ` Tom Tromey 2012-12-10 10:57 ` Hui Zhu 2012-12-10 19:55 ` Tom Tromey 2012-12-11 7:22 ` Hui Zhu 2012-12-12 11:01 ` Hui Zhu 2012-12-12 15:38 ` Tom Tromey 2012-12-13 1:45 ` Hui Zhu 2012-12-14 19:18 ` Tom Tromey 2012-12-17 3:00 ` Hui Zhu 2012-12-17 20:04 ` Tom Tromey 2012-12-18 7:03 ` Hui Zhu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox