Benjamin Goldberg <[EMAIL PROTECTED]> writes:

> I'm looking for, but not finding, information regarding the character
> type and encoding on parrot io objects.
> 
> As an example of why... I found this in io.ops :
> 
> op write(in PMC) {
>   PMC *p = $1;
>   STRING *s = (VTABLE_get_string(interpreter, p));
>   if (s) {
>     PIO_write(interpreter, PIO_STDOUT(interpreter),
>               s->strstart, s->bufused);
>   }
>   goto NEXT();
> }
> 
> Surely, blinding writing the bytes that are in a string, without
> checking that the string's encoding and type match that of the stream,
> is wrong.

The PIO-system does not know anything about encodings yet, but they
need to. We might push a encoding transforming layer on top of the
current layerstack.

> I would expect something like:
> 
> op write(in PMC) {
>    PMC *p = $1;
>    STRING *s = VTABLE_get_string(interpreter, p);
>    if( s ) {
>       PMC *o = PIO_STDOUT(interpreter);
>       string_transcode(interpreter, s,
>          PIO_encoding(interpreter, o),
>          PIO_chartype(interpreter, o), &s);
>       PIO_write(interpreter, o, s->strstart, s->bufused);
>    }
>    goto NEXT();
> }

My current plan is to have it more like:

op write(in PMC) {
  STRING *s = VTABLE_get_string(interpreter, $1);
  if (s) {
    PIO_puts(interpreter, PIO_STDOUT(interpreter), s);
  }
  goto NEXT();
}

with a revised PIO_puts API (using a parrotstring instead of a
c-string).

> Except that I can't seem to find any PIO_encoding and PIO_chartype
> functions.

Maybe we need to implement them. They surely must get integrated in
the ParrotIOLayerAPI to support transcoding layers.

> #############
> 
> Actually... I think that the op print(in PMC) and write(in PMC) are
> designed wrong.  Instead of asking for a string, and printing that
> string, they should call a print_self and/or write_self vtable method on
> the PMC, passing in the PIO object.

Putting an object to a stream is one of the most basic operations for
a PMC. But I don't think its a good idea to introduce many more vtable
functions. (Vtables are already really fat, mostly because every
PMC needs to know how to multiply a ParrotIO with the keyed version of
a Continuation). print, write, dump and all call one function. The way
of printing/writing/dumping the data should be controlled via flags
which can be stored in the stream.

> In turn, the default
> implementations of those methods should print or write the results of
> DYNSELF.get_string() to that PIO object.
> 
> This way, a PMC whose string representation is very large doesn't need
> to serialize itself to a string before it can be printed -- it can print
> itself directly to the PIO object, thus avoiding allocating memory for
> that big string, and probably lots of copying.
> 
> To avoid loss of synchronization between the get_string form of a pmc
> and the print_self/write_self form of a pmc, one should be able to
> define a string's get_string as creating a new stringstream PIO object,
> printing itself to that stream, and returning the corresponding string. 
> However, there doesn't (yet) seem to be a stringstream layer.  When do
> we expect to have one?

There will be one. When? When I find time to do it or you (or anybody
else) submitts a patch. 

Implementations of read/write and seek/tell are fairly
trivial. Problem is fdopen/getfd; the PIOHANDLE needs to be
interpreted as a string-pointer. We have semantic problems of fdopen
on other platforms than Unix (stdio, win32). This normaly leads to
failing t/pmc/io 3-4.
 
> #############
> 
> PIO_putps converts to a cstring, then calls PIO_puts.

PIO_puts is subject to change. The printing of cstrings can be
trivially done by calls to PIO_write. This will be ripped out of the
ParrotIOLayerAPI and a new puts wich passes parrotstrings down the
layers is introduced.

> Since PIO_puts doesn't take a length, obviously it must be determining
> the length of the string based on the presence of a nul character in
> it.  Thus, we cannot use PIO_puts to print binary data.  This means that
> PIO_write must be used.  Since there's no op write(in STR), the only way
> to do it from parrot is to create a PerlString, store our Sreg into it,
> then call write.  Blech.
> 
> #############
> 
> Shouldn't everything in io_unix.c (except for pio_unix_layer) be
> static?  This isn't "just" about namespace pollution -- it slows down
> linking and dynamic loading.  I think.
> 
> Hmm, the same applies to the other io_foo.c files.

Yes it should. There should not be any inter-layer calls except via
the layerstack. Making them static would enforce this. If nobody
objects I will commit this change.

> #############
> 
> Why does PIO_unix_seek clear errno before calling lseek?

Don't know. Its in the code since Melvin added the seek in Jan 2002.
I will remove it.

> #############
> 
> Why does PIO_unix_tell have a temp variable "pos"?

This value gets returned.

bye
boe
-- 
Juergen Boemmels                        [EMAIL PROTECTED]
Fachbereich Physik                      Tel: ++49-(0)631-205-2817
Universitaet Kaiserslautern             Fax: ++49-(0)631-205-3906
PGP Key fingerprint = 9F 56 54 3D 45 C1 32 6F  23 F6 C7 2F 85 93 DD 47

Reply via email to