[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: bison-20001221
From: |
Akim Demaille |
Subject: |
Re: bison-20001221 |
Date: |
22 Jan 2001 11:40:01 +0100 |
User-agent: |
Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.1 (Crater Lake) |
>>>>> "Hans" == Hans Aberg <address@hidden> writes:
Hans> At 12:24 +0100 1-01-18, Akim Demaille wrote: Another idea I had
Hans> is to make obstack into a FILE
>> May I recall that we moved to obstack to avoid temp files?
Hans> May I recall that FILE is a C data struct and not a file? :-)
Err, right, sorry. But then, I don't understand what you mean.
Hans> -- The idea is of course to make something like obstack working
Hans> on memory, but wrapped up to look like a FILE struct. It would
Hans> have been easy in C++, in C I do not know.
Aah, that. Well, again, this is out of the scope of this list. And
indeed the Glibc has that feature:
- Function: int obstack_printf (struct obstack *OBSTACK, const char
*TEMPLATE, ...)
This function is similar to `asprintf', except that it uses the
obstack OBSTACK to allocate the space. *Note Obstacks::.
The characters are written onto the end of the current object. To
get at them, you must finish the object with `obstack_finish'
(*note Growing Objects::).
and
Obstack Streams
---------------
You can open an output stream that puts it data in an obstack.
*Note Obstacks::.
- Function: FILE * open_obstack_stream (struct obstack *OBSTACK)
This function opens a stream for writing data into the obstack
OBSTACK. This starts an object in the obstack and makes it grow
as data is written (*note Growing Objects::).
Calling `fflush' on this stream updates the current size of the
object to match the amount of data that has been written. After a
call to `fflush', you can examine the object temporarily.
You can move the file position of an obstack stream with `fseek' or
`fseeko' (*note File Positioning::). Moving the file position past
the end of the data written fills the intervening space with zeros.
To make the object permanent, update the obstack with `fflush', and
then use `obstack_finish' to finalize the object and get its
address. The following write to the stream starts a new object in
the obstack, and later writes add to that object until you do
another `fflush' and `obstack_finish'.
But how do you find out how long the object is? You can get the
length in bytes by calling `obstack_object_size' (*note Status of
an Obstack::), or you can null-terminate the object like this:
obstack_1grow (OBSTACK, 0);
Whichever one you do, you must do it _before_ calling
`obstack_finish'. (You can do both if you wish.)
Here is a sample function that uses `open_obstack_stream':
char *
make_message_string (const char *a, int b)
{
FILE *stream = open_obstack_stream (&message_obstack);
output_task (stream);
fprintf (stream, ": ");
fprintf (stream, a, b);
fprintf (stream, "\n");
fclose (stream);
obstack_1grow (&message_obstack, 0);
return obstack_finish (&message_obstack);
}
but it's not portable.
Hans> The header <size_t.h> is included from <stddef.h> on my
Hans> computer, and the latter is ISO/ANSI C.
GNU is about POSIX. And why did this size_t.h stuff show up actually?
OK with stddefs.h etc, but this is definitely the first time I hear
about size_t.h. But really, *end of this story*, I am *not*
interested in porting Bison to MacOS.
- Re: bison-20001221, (continued)
Re: bison-20001221, Hans Aberg, 2001/01/13
Re: bison-20001221, Hans Aberg, 2001/01/12
- Re: bison-20001221, Akim Demaille, 2001/01/18
- Re: bison-20001221, Hans Aberg, 2001/01/18
- Re: bison-20001221, Hans Aberg, 2001/01/19
- Re: bison-20001221,
Akim Demaille <=
- Re: bison-20001221, Hans Aberg, 2001/01/22
- Re: bison-20001221, Axel Kittenberger, 2001/01/22
- Re: bison-20001221, Hans Aberg, 2001/01/22
- Re: bison-20001221, Axel Kittenberger, 2001/01/22
- Re: bison-20001221, Hans Aberg, 2001/01/23
Re: bison-20001221, Hans Aberg, 2001/01/22
Re: bison-20001221, Akim Demaille, 2001/01/22
Re: bison-20001221, Hans Aberg, 2001/01/22
Re: bison-20001221, Akim Demaille, 2001/01/22
Re: bison-20001221, Hans Aberg, 2001/01/23