- struct mem_file *stream = ui_file_data (file);
-
- if (stream->magic != &mem_file_magic)
- internal_error (__FILE__, __LINE__,
- _("mem_file_write: bad magic number"));
- if (stream->buffer == NULL)
- {
- stream->length_buffer = length_buffer;
- stream->sizeof_buffer = length_buffer;
- stream->buffer = xmalloc (stream->sizeof_buffer);
- memcpy (stream->buffer, buffer, length_buffer);
- }
- else
- {
- int new_length = stream->length_buffer + length_buffer;
-
- if (new_length >= stream->sizeof_buffer)
- {
- stream->sizeof_buffer = new_length;
- stream->buffer = xrealloc (stream->buffer, stream->sizeof_buffer);
- }
- memcpy (stream->buffer + stream->length_buffer, buffer, length_buffer);
- stream->length_buffer = new_length;
- }
-}
-\f
-/* ``struct ui_file'' implementation that maps directly onto
- <stdio.h>'s FILE. */
-
-static ui_file_write_ftype stdio_file_write;
-static ui_file_write_async_safe_ftype stdio_file_write_async_safe;
-static ui_file_fputs_ftype stdio_file_fputs;
-static ui_file_read_ftype stdio_file_read;
-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;
-
-struct stdio_file
- {
- int *magic;
- FILE *file;
- /* The associated file descriptor is extracted ahead of time for
- stdio_file_write_async_safe's benefit, in case fileno isn't async-safe. */
- int fd;
- int close_p;
- };
-
-static struct ui_file *
-stdio_file_new (FILE *file, int close_p)
-{
- struct ui_file *ui_file = ui_file_new ();
- struct stdio_file *stdio = xmalloc (sizeof (struct stdio_file));
-
- stdio->magic = &stdio_file_magic;
- stdio->file = file;
- stdio->fd = fileno (file);
- stdio->close_p = close_p;
- set_ui_file_data (ui_file, stdio, stdio_file_delete);
- set_ui_file_flush (ui_file, stdio_file_flush);
- set_ui_file_write (ui_file, stdio_file_write);
- set_ui_file_write_async_safe (ui_file, stdio_file_write_async_safe);
- 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;
-}
-
-static void
-stdio_file_delete (struct ui_file *file)
-{
- struct stdio_file *stdio = ui_file_data (file);
-
- if (stdio->magic != &stdio_file_magic)
- internal_error (__FILE__, __LINE__,
- _("stdio_file_delete: bad magic number"));
- if (stdio->close_p)
- {
- fclose (stdio->file);
- }
- xfree (stdio);