cvsuser 03/07/01 08:41:06
Modified: . embed.c io.ops
classes parrotio.pmc
include/parrot io.h
io io.c io_unix.c
Log:
This is the first step of the IO-system away from the mem_sys_alloc/free
memory-managment system to a full-fledged PMC-based system.
In this patch only the ParrotIO structures are transformed to a
PMC. This is simply done by wrapping the ParrotIO in a PMC_data. For
easier access of the layer-pointer (this is the first thing that is
actually needed if a function is called) is stored in the
cache.struct_val. The rest of the patch is mostly to an update of
parrot to the new prototypes.
The filedescriptor-ops are not deleted in this patch, but use
a hack to always create a new temporary PMC from the filedescriptor.
The standard filedescriptors stdin, stdout and stderr are protected
from closing by the PMC_destroy function by marking them as
PIO_F_SHARED. Don't know if this is a right solution.
Courtesy of Jürgen Bömmels <[EMAIL PROTECTED]>
(Committer's note: I think this exposes some latent bugs, as it fails
9 tests on OS X, but getting it in is worth it so other folks can
thump the thing)
Revision Changes Path
1.69 +3 -3 parrot/embed.c
Index: embed.c
===================================================================
RCS file: /cvs/public/parrot/embed.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -w -r1.68 -r1.69
--- embed.c 14 Jun 2003 17:48:31 -0000 1.68
+++ embed.c 1 Jul 2003 15:41:00 -0000 1.69
@@ -1,7 +1,7 @@
/* embed.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: embed.c,v 1.68 2003/06/14 17:48:31 dan Exp $
+ * $Id: embed.c,v 1.69 2003/07/01 15:41:00 dan Exp $
* Overview:
* The Parrot embedding interface.
* Data Structure and Algorithms:
@@ -71,7 +71,7 @@
off_t program_size, wanted;
char *program_code;
struct PackFile *pf;
- ParrotIO * io = NULL;
+ PMC * io = NULL;
INTVAL is_mapped = 0;
#ifdef HAS_HEADER_SYSSTAT
@@ -84,7 +84,7 @@
if (filename == NULL || strcmp(filename, "-") == 0) {
/* read from STDIN */
- io = PIO_STDIN(interpreter);
+ io = new_io_pmc(interpreter, PIO_STDIN(interpreter));
/* read 1k at a time */
program_size = 0;
}
1.24 +41 -60 parrot/io.ops
Index: io.ops
===================================================================
RCS file: /cvs/public/parrot/io.ops,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -w -r1.23 -r1.24
--- io.ops 30 Jun 2003 07:47:32 -0000 1.23
+++ io.ops 1 Jul 2003 15:41:00 -0000 1.24
@@ -36,7 +36,7 @@
=cut
inline op close(in PMC) {
- PIO_close(interpreter, (ParrotIO*)(PMC_data($1)));
+ PIO_close(interpreter, $1);
goto NEXT();
}
@@ -58,20 +58,15 @@
ParrotIO *io;
mode = string_to_cstring(interpreter, $3);
- io = PIO_fdopen(interpreter, $2, mode);
+ $1 = PIO_fdopen(interpreter, $2, mode);
+ if (!$1) {
+ $1 = pmc_new(interpreter, enum_class_PerlUndef);
+ }
/* string_cstring_free(mode); */
/* TODO all results from sring_to_cstring() need freeing
but this generates ugly warnings WRT discarding the const
qualifier -lt
*/
- if (io) {
- $1 = pmc_new_noinit(interpreter, enum_class_ParrotIO);
- VTABLE_init(interpreter, $1);
- PMC_data($1) = io;
- }
- else {
- $1 = pmc_new(interpreter, enum_class_PerlUndef);
- }
#else
$1 = pmc_new(interpreter, enum_class_PerlUndef);
#endif
@@ -88,22 +83,16 @@
=cut
inline op open(out PMC, in STR, in STR) {
- ParrotIO * io;
/* These char * need to go away soon */
const char * path, * mode;
path = string_to_cstring(interpreter, $2);
mode = string_to_cstring(interpreter, $3);
- io = PIO_open(interpreter, path, mode);
+ $1 = PIO_open(interpreter, path, mode);
/* string_cstring_free(mode); */
/* string_cstring_free(path); */
- if(io) {
- $1 = pmc_new_noinit(interpreter, enum_class_ParrotIO);
- VTABLE_init(interpreter, $1);
- PMC_data($1) = io;
- }
- else {
+ if(!$1) {
$1 = pmc_new(interpreter, enum_class_PerlUndef);
}
goto NEXT();
@@ -123,7 +112,7 @@
op open(out INT, in STR) {
char *path = string_to_cstring(interpreter, $2);
- ParrotIO *io = PIO_open(interpreter, path, "+<");
+ PMC *io = PIO_open(interpreter, path, "+<");
/* string_cstring_free(path); */
if (io) {
$1 = PIO_getfd(interpreter, io);
@@ -137,7 +126,7 @@
op open(out INT, in STR, in STR) {
char *path = string_to_cstring(interpreter, $2);
char *mode = string_to_cstring(interpreter, $3);
- ParrotIO *io = PIO_open(interpreter, path, mode);
+ PMC *io = PIO_open(interpreter, path, mode);
/* string_cstring_free(mode); */
/* string_cstring_free(path); */
if (io) {
@@ -151,7 +140,7 @@
########################################
-=item B<close>(out INT)
+=item B<close>(inout INT)
Close file opened on file descriptor $1.
@@ -165,7 +154,7 @@
table = ((ParrotIOData*)interpreter->piodata)->table;
io = table[$1];
table[$1] = NULL;
- PIO_close(interpreter, io);
+ PIO_close(interpreter, new_io_pmc(interpreter, io));
}
goto NEXT();
}
@@ -208,16 +197,18 @@
op print(in STR) {
STRING *s = $1;
if (s && string_length(s)) {
- PIO_putps(interpreter, PIO_STDOUT(interpreter), s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
+ s);
}
goto NEXT();
}
op print(in PMC) {
PMC *p = $1;
- STRING *s = (p->vtable->get_string(interpreter, p));
+ STRING *s = (VTABLE_get_string(interpreter, p));
if (s) {
- PIO_putps(interpreter, PIO_STDOUT(interpreter), s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
+ s);
}
goto NEXT();
}
@@ -226,14 +217,14 @@
op print(in INT, in INT) {
ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
STRING *s = Parrot_sprintf_c(interpreter, INTVAL_FMT, $2);
- PIO_putps(interpreter, io, s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
goto NEXT();
}
op print(in INT, in NUM) {
ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
STRING *s = Parrot_sprintf_c(interpreter, "%f", (double)$2);
- PIO_putps(interpreter, io, s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
goto NEXT();
}
@@ -241,7 +232,7 @@
STRING *s = $2;
ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
if (s && string_length(s)) {
- PIO_putps(interpreter, io, s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
}
goto NEXT();
}
@@ -251,14 +242,14 @@
ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
STRING *s = (p->vtable->get_string(interpreter, p));
if (s) {
- PIO_putps(interpreter, io, s);
+ PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
}
goto NEXT();
}
op flush(in INT) {
ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
- PIO_flush(interpreter, io);
+ PIO_flush(interpreter, new_io_pmc(interpreter, io));
goto NEXT();
}
@@ -271,10 +262,8 @@
=cut
op print(in PMC, in STR) {
- ParrotIO * io;
- io = (ParrotIO*)(PMC_data($1));
- if ($2 && io) {
- PIO_write(interpreter, io, ($2)->strstart, string_length($2));
+ if ($2 && $1) {
+ PIO_write(interpreter, $1, ($2)->strstart, string_length($2));
}
goto NEXT();
}
@@ -289,8 +278,8 @@
op printerr(in STR) {
if ($1) {
- PIO_write(interpreter, PIO_STDERR(interpreter), ($1)->strstart,
- string_length($1));
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDERR(interpreter)),
+ $1);
}
goto NEXT();
}
@@ -311,28 +300,22 @@
=cut
op puts(in STR) {
- if (($1) && string_length($1)) {
- PIO_write(interpreter, PIO_STDOUT(interpreter), ($1)->strstart,
- string_length($1));
+ if ($1) {
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
+ $1);
}
goto NEXT();
}
op puts(in INT) {
STRING * s = string_from_int(interpreter, $1);
- if (string_length(s)) {
- PIO_write(interpreter, PIO_STDOUT(interpreter), s->strstart,
- string_length(s));
- }
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)), s);
goto NEXT();
}
op puts(in NUM) {
STRING * s = Parrot_sprintf_c(interpreter, "%f", $1);
- if (string_length(s)) {
- PIO_write(interpreter, PIO_STDOUT(interpreter), s->strstart,
- string_length(s));
- }
+ PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)), s);
goto NEXT();
}
@@ -363,7 +346,8 @@
n = $2;
$1 = string_make(interpreter, NULL, n, NULL, 0, NULL);
memset(($1)->strstart, 0, n);
- nr = PIO_read(interpreter, PIO_STDIN(interpreter), ($1)->strstart, (size_t)n);
+ nr = PIO_read(interpreter, new_io_pmc(interpreter, PIO_STDIN(interpreter)),
+ ($1)->strstart, (size_t)n);
if(nr > 0)
($1)->strlen = ($1)->bufused = nr;
else
@@ -380,8 +364,7 @@
n = $3;
$1 = string_make(interpreter, NULL, n, NULL, 0, NULL);
memset(($1)->strstart, 0, n);
- nr = PIO_read(interpreter, (ParrotIO*)(PMC_data($2)),
- ($1)->strstart, (size_t)n);
+ nr = PIO_read(interpreter, $2, ($1)->strstart, (size_t)n);
if(nr > 0)
($1)->strlen = ($1)->bufused = nr;
else
@@ -405,9 +388,11 @@
memset(($1)->strstart, 0, 65535);
if ($2 >= 0) {
+ PMC *pmc;
io = ((ParrotIOData*)interpreter->piodata)->table[$2];
- PIO_setlinebuf(interpreter, io);
- len = PIO_read(interpreter, io, ($1)->strstart, 65534);
+ pmc = new_io_pmc(interpreter, io);
+ PIO_setlinebuf(interpreter, pmc);
+ len = PIO_read(interpreter, pmc, ($1)->strstart, 65534);
($1)->strlen = ($1)->bufused = len;
}
goto NEXT();
@@ -430,19 +415,15 @@
=cut
op seek(out INT, in PMC, in INT, in INT) {
- ParrotIO * io;
- io = (ParrotIO*)(PMC_data($2));
- if (io) {
- $1 = (INTVAL)PIO_seek(interpreter, io, 0, $3, $4);
+ if ($2) {
+ $1 = (INTVAL)PIO_seek(interpreter, $2, 0, $3, $4);
}
goto NEXT();
}
op seek(out INT, in PMC, in INT, in INT, in INT) {
- ParrotIO * io;
- io = (ParrotIO*)(PMC_data($2));
- if (io) {
- $1 = (INTVAL)PIO_seek(interpreter, io, $3, $4, $5);
+ if ($2) {
+ $1 = (INTVAL)PIO_seek(interpreter, $2, $3, $4, $5);
}
goto NEXT();
}
1.2 +4 -4 parrot/classes/parrotio.pmc
Index: parrotio.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/parrotio.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- parrotio.pmc 23 Jun 2003 09:26:18 -0000 1.1
+++ parrotio.pmc 1 Jul 2003 15:41:02 -0000 1.2
@@ -1,7 +1,7 @@
/* ParrotIO.pmc
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: parrotio.pmc,v 1.1 2003/06/23 09:26:18 leo Exp $
+ * $Id: parrotio.pmc,v 1.2 2003/07/01 15:41:02 dan Exp $
* Overview:
* These are the vtable functions for Parrot IO
* Data Structure and Algorithms:
@@ -26,8 +26,8 @@
}
void destroy () {
- if (PMC_data(SELF)) {
- PIO_close(interpreter, (ParrotIO*)(PMC_data(SELF)));
- }
+ ParrotIO *io = PMC_data(SELF);
+ if (!(io->flags & PIO_F_SHARED))
+ PIO_close(interpreter, SELF);
}
}
1.33 +21 -21 parrot/include/parrot/io.h
Index: io.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/io.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -w -r1.32 -r1.33
--- io.h 23 Jun 2003 09:26:25 -0000 1.32
+++ io.h 1 Jul 2003 15:41:05 -0000 1.33
@@ -1,7 +1,7 @@
/* io.h
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: io.h,v 1.32 2003/06/23 09:26:25 leo Exp $
+ * $Id: io.h,v 1.33 2003/07/01 15:41:05 dan Exp $
* Overview:
* Parrot IO subsystem
* Data Structure and Algorithms:
@@ -293,42 +293,42 @@
extern void PIO_finish(theINTERP);
extern INTVAL PIO_init_stacks(theINTERP);
extern void PIO_atexit(theINTERP);
-extern INTVAL PIO_push_layer(theINTERP, ParrotIOLayer *, ParrotIO *);
-extern ParrotIOLayer *PIO_pop_layer(theINTERP, ParrotIO *);
+extern INTVAL PIO_push_layer(theINTERP, ParrotIOLayer *, PMC *);
+extern ParrotIOLayer *PIO_pop_layer(theINTERP, PMC *);
extern ParrotIOLayer *PIO_copy_stack(ParrotIOLayer *);
+extern struct PMC *new_io_pmc(struct Parrot_Interp *, ParrotIO *);
extern void free_io_header(ParrotIO *);
extern ParrotIOTable alloc_pio_array(int);
extern int realloc_pio_array(ParrotIOTable *, int);
-extern ParrotIO *PIO_new(struct Parrot_Interp *, ParrotIO *,
- INTVAL, INTVAL, INTVAL);
-extern void PIO_destroy(theINTERP, ParrotIO *io);
+extern ParrotIO *PIO_new(struct Parrot_Interp *, INTVAL, INTVAL, INTVAL);
+extern void PIO_destroy(theINTERP, PMC *io);
extern INTVAL PIO_base_init(theINTERP, ParrotIOLayer *proto);
extern ParrotIOLayer *PIO_base_new_layer(ParrotIOLayer *proto);
extern void PIO_base_delete_layer(ParrotIOLayer *proto);
extern INTVAL PIO_parse_open_flags(const char *flagstr);
-extern ParrotIO *PIO_open(theINTERP, const char *, const char *);
-extern ParrotIO *PIO_fdopen(theINTERP, PIOHANDLE, const char *);
-extern INTVAL PIO_close(theINTERP, ParrotIO *);
-extern void PIO_flush(theINTERP, ParrotIO *);
-extern INTVAL PIO_read(theINTERP, ParrotIO *, void *, size_t);
-extern INTVAL PIO_write(theINTERP, ParrotIO *, void *, size_t);
-extern INTVAL PIO_setbuf(theINTERP, ParrotIO *, size_t);
-extern INTVAL PIO_setlinebuf(theINTERP, ParrotIO *);
-extern INTVAL PIO_puts(theINTERP, ParrotIO *, const char *);
-extern INTVAL PIO_seek(theINTERP, ParrotIO *, INTVAL hi,
+extern PMC *PIO_open(theINTERP, const char *, const char *);
+extern PMC *PIO_fdopen(theINTERP, PIOHANDLE, const char *);
+extern INTVAL PIO_close(theINTERP, PMC *);
+extern void PIO_flush(theINTERP, PMC *);
+extern INTVAL PIO_read(theINTERP, PMC *, void *, size_t);
+extern INTVAL PIO_write(theINTERP, PMC *, void *, size_t);
+extern INTVAL PIO_setbuf(theINTERP, PMC *, size_t);
+extern INTVAL PIO_setlinebuf(theINTERP, PMC *);
+extern INTVAL PIO_puts(theINTERP, PMC *, const char *);
+extern INTVAL PIO_seek(theINTERP, PMC *, INTVAL hi,
INTVAL lo, INTVAL whence);
-extern INTVAL PIO_eof(theINTERP, ParrotIO *);
+extern INTVAL PIO_eof(theINTERP, PMC *);
-extern INTVAL PIO_putps(theINTERP, ParrotIO *io, STRING *s);
-extern INTVAL PIO_fprintf(theINTERP, ParrotIO *io, const char *s, ...);
+extern INTVAL PIO_putps(theINTERP, PMC *io, STRING *s);
+extern INTVAL PIO_fprintf(theINTERP, PMC *io, const char *s, ...);
extern INTVAL PIO_printf(theINTERP, const char *s, ...);
extern INTVAL PIO_eprintf(theINTERP, const char *s, ...);
-extern INTVAL PIO_getfd(theINTERP, ParrotIO *io);
-extern PIOOFF_T PIO_tell(theINTERP, ParrotIO *io);
+extern INTVAL PIO_getfd(theINTERP, PMC *io);
+extern PIOOFF_T PIO_tell(theINTERP, PMC *io);
/* Put platform specific macros here if you must */
#ifdef PIO_OS_WIN32
1.40 +121 -98 parrot/io/io.c
Index: io.c
===================================================================
RCS file: /cvs/public/parrot/io/io.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -w -r1.39 -r1.40
--- io.c 30 Jun 2003 16:02:54 -0000 1.39
+++ io.c 1 Jul 2003 15:41:06 -0000 1.40
@@ -1,7 +1,7 @@
/* io.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: io.c,v 1.39 2003/06/30 16:02:54 leo Exp $
+ * $Id: io.c,v 1.40 2003/07/01 15:41:06 dan Exp $
* Overview:
* This is the Parrot IO subsystem API. Generic IO stuff
* goes here, each specific layer goes in its own file...
@@ -40,16 +40,15 @@
PIOOFF_T piooffsetzero;
-#if 0
-void
-free_io_header(ParrotIO *io)
+PMC *
+new_io_pmc(theINTERP, ParrotIO *io)
{
- /* Free buffer if it was malloced */
- if (io->b.startb && (io->b.flags & PIO_BF_MALLOC))
- free(io->b.startb);
- free(io);
+ PMC *new_pmc;
+ new_pmc = pmc_new(interpreter, enum_class_ParrotIO);
+ PMC_data(new_pmc) = io;
+ new_pmc->cache.struct_val = io->stack;
+ return new_pmc;
}
-#endif
ParrotIOTable
alloc_pio_array(int numhandles)
@@ -69,18 +68,15 @@
}
/*
- * Create a new IO stream, optionally reusing old structure.
+ * Create a new IO stream,
*/
ParrotIO *
-PIO_new(theINTERP, ParrotIO *old, INTVAL iotype, INTVAL flags, INTVAL mode)
+PIO_new(theINTERP, INTVAL iotype, INTVAL flags, INTVAL mode)
{
ParrotIO *new_io;
UNUSED(iotype);
- if (old) {
- /* FIXME: Reuse old IO */
- }
new_io = (ParrotIO *)mem_sys_allocate(sizeof(ParrotIO));
new_io->fpos = new_io->lpos = piooffsetzero;
new_io->flags = flags;
@@ -98,8 +94,9 @@
* Destroying the IO-Stream, at the moment only free memory
*/
void
-PIO_destroy(theINTERP, ParrotIO *io)
+PIO_destroy(theINTERP, PMC *pmc)
{
+ ParrotIO *io = PMC_data(pmc);
UNUSED(interpreter);
if (io->b.startb && (io->b.flags & PIO_BF_MALLOC))
@@ -137,7 +134,7 @@
}
if (Interp_flags_TEST(interpreter, PARROT_DEBUG_FLAG)) {
- PIO_puts(interpreter, PIO_STDERR(interpreter),
+ PIO_puts(interpreter, new_io_pmc(interpreter, PIO_STDERR(interpreter)),
"PIO: IO system initialized.\n");
}
}
@@ -156,7 +153,7 @@
for (i = 0 ; i < PIO_NR_OPEN; i++) {
if ( (io = GET_INTERP_IOD(interpreter)->table[i]) ) {
- PIO_close(interpreter, io);
+ PIO_close(interpreter, new_io_pmc(interpreter, io));
}
}
for (p = GET_INTERP_IO(interpreter); p; ) {
@@ -275,12 +272,15 @@
* Push a layer onto an IO object or the default stack
*/
INTVAL
-PIO_push_layer(theINTERP, ParrotIOLayer *layer, ParrotIO *io)
+PIO_push_layer(theINTERP, ParrotIOLayer *layer, PMC *pmc)
{
ParrotIOLayer *t;
+
if (layer == NULL)
return -1;
- if (io != NULL) {
+ if (pmc != NULL) {
+ ParrotIO *io = PMC_data(pmc);
+
if (io->stack == NULL && (layer->flags & PIO_L_TERMINAL) == 0) {
/* Error( 1st layer must be terminal) */
return -1;
@@ -328,9 +328,11 @@
* Pop a layer from an IO object or the default stack
*/
ParrotIOLayer *
-PIO_pop_layer(theINTERP, ParrotIO *io)
+PIO_pop_layer(theINTERP, PMC *pmc)
{
ParrotIOLayer *layer;
+ ParrotIO *io = PMC_data(pmc);
+
if (io) {
layer = io->stack;
if (layer) {
@@ -437,12 +439,14 @@
* API for controlling buffering specifics on an IO stream
*/
INTVAL
-PIO_setbuf(theINTERP, ParrotIO *io, size_t bufsize)
+PIO_setbuf(theINTERP, PMC *pmc, size_t bufsize)
{
- ParrotIOLayer *l = io->stack;
- PIO_flush(interpreter, io);
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
+ PIO_flush(interpreter, pmc);
while (l) {
if (l->api->SetBuf) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->SetBuf) (interpreter, l, io, bufsize);
}
l = PIO_DOWNLAYER(l);
@@ -453,12 +457,13 @@
INTVAL
-PIO_setlinebuf(theINTERP, ParrotIO *io)
+PIO_setlinebuf(theINTERP, PMC *pmc)
{
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
while (l) {
if (l->api->SetLineBuf) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->SetLineBuf) (interpreter, l, io);
}
l = PIO_DOWNLAYER(l);
@@ -468,18 +473,19 @@
}
-ParrotIO *
+PMC *
PIO_open(theINTERP, const char *spath, const char *sflags)
{
ParrotIO *io;
ParrotIOLayer *l = GET_INTERP_IO(interpreter);
INTVAL flags = PIO_parse_open_flags(sflags);
+
while (l) {
if (l->api->Open) {
io = (*l->api->Open) (interpreter, l, spath, flags);
if (io) {
io->stack = GET_INTERP_IO(interpreter);
- return io;
+ return new_io_pmc(interpreter, io);
}
else {
return NULL;
@@ -496,18 +502,24 @@
* This is particularly used to init Parrot Standard IO onto
* the OS IO handles (0,1,2).
*/
-ParrotIO *
+PMC *
PIO_fdopen(theINTERP, PIOHANDLE fd, const char *sflags)
{
ParrotIO *io;
INTVAL flags;
ParrotIOLayer *l = GET_INTERP_IO(interpreter);
+
flags = PIO_parse_open_flags(sflags);
while (l) {
if (l->api->FDOpen) {
io = (*l->api->FDOpen) (interpreter, l, fd, flags);
+ if (io) {
io->stack = GET_INTERP_IO(interpreter);
- return io;
+ return new_io_pmc(interpreter, io);
+ }
+ else {
+ return NULL;
+ }
}
l = PIO_DOWNLAYER(l);
}
@@ -516,56 +528,57 @@
INTVAL
-PIO_close(theINTERP, ParrotIO *io)
+PIO_close(theINTERP, PMC *pmc)
{
INTVAL res;
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Close) {
- PIO_flush(interpreter, io);
+ ParrotIO *io = PMC_data(pmc);
+ PIO_flush(interpreter, pmc);
res = (*l->api->Close) (interpreter, l, io);
- PIO_destroy(interpreter, io);
+ PIO_destroy(interpreter, pmc);
return res;
}
l = PIO_DOWNLAYER(l);
}
- }
+
return 0;
}
void
-PIO_flush(theINTERP, ParrotIO *io)
+PIO_flush(theINTERP, PMC *pmc)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Flush) {
+ ParrotIO *io = PMC_data(pmc);
(*l->api->Flush) (interpreter, l, io);
return;
}
l = PIO_DOWNLAYER(l);
}
}
-}
/*
* Iterate down the stack to the first layer implementing "Read" API
*/
INTVAL
-PIO_read(theINTERP, ParrotIO *io, void *buffer, size_t len)
+PIO_read(theINTERP, PMC *pmc, void *buffer, size_t len)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Read) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->Read) (interpreter, l, io, buffer, len);
}
l = PIO_DOWNLAYER(l);
}
- }
return 0;
}
@@ -575,17 +588,17 @@
* Iterate down the stack to the first layer implementing "Write" API
*/
INTVAL
-PIO_write(theINTERP, ParrotIO *io, void *buffer, size_t len)
+PIO_write(theINTERP, PMC *pmc, void *buffer, size_t len)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Write) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->Write) (interpreter, l, io, buffer, len);
}
l = PIO_DOWNLAYER(l);
}
- }
return 0;
}
@@ -597,17 +610,18 @@
* a 1 and 2 arg version of seek opcode.
*/
INTVAL
-PIO_seek(theINTERP, ParrotIO *io, INTVAL hi, INTVAL lo, INTVAL w)
+PIO_seek(theINTERP, PMC *pmc, INTVAL hi, INTVAL lo, INTVAL w)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Seek) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->Seek) (interpreter, l, io, hi, lo, w);
}
l = PIO_DOWNLAYER(l);
}
- }
+
return -1;
}
@@ -616,17 +630,17 @@
* Iterate down the stack to the first layer implementing "Tell" API
*/
PIOOFF_T
-PIO_tell(theINTERP, ParrotIO *io)
+PIO_tell(theINTERP, PMC *pmc)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->Tell) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->Tell) (interpreter, l, io);
}
l = PIO_DOWNLAYER(l);
}
- }
return -1;
}
@@ -636,8 +650,10 @@
* Iterate down the stack to the first layer implementing "Read" API
*/
INTVAL
-PIO_eof(theINTERP, ParrotIO *io)
+PIO_eof(theINTERP, PMC *pmc)
{
+ ParrotIO *io = PMC_data(pmc);
+
if (io) {
return (io->flags & (PIO_F_EOF)) != 0;
}
@@ -649,38 +665,41 @@
* PIO_putps is for.
*/
INTVAL
-PIO_puts(theINTERP, ParrotIO *io, const char *s)
+PIO_puts(theINTERP, PMC *pmc, const char *s)
{
- if (io) {
- ParrotIOLayer *l = io->stack;
+ ParrotIOLayer *l = pmc->cache.struct_val;
+
while (l) {
if (l->api->PutS) {
+ ParrotIO *io = PMC_data(pmc);
return (*l->api->PutS) (interpreter, l, io, s);
}
l = PIO_DOWNLAYER(l);
}
- }
return -1;
}
INTVAL
-PIO_putps(theINTERP, ParrotIO *io, STRING *s) {
+PIO_putps(theINTERP, PMC *pmc, STRING *s)
+{
INTVAL retVal;
+
char *temp = string_to_cstring(interpreter, s);
- retVal = PIO_puts(interpreter, io, temp);
+ retVal = PIO_puts(interpreter, pmc, temp);
free(temp);
return retVal;
}
INTVAL
-PIO_fprintf(theINTERP, ParrotIO *io, const char *s, ...) {
+PIO_fprintf(theINTERP, PMC *pmc, const char *s, ...)
+{
va_list args;
INTVAL ret=-1;
va_start(args, s);
- ret=PIO_putps(interpreter, io, Parrot_vsprintf_c(interpreter, s, args));
+ ret=PIO_putps(interpreter, pmc, Parrot_vsprintf_c(interpreter, s, args));
va_end(args);
@@ -698,7 +717,8 @@
str=Parrot_vsprintf_c(interpreter, s, args);
if(interpreter) {
- ret=PIO_putps(interpreter, PIO_STDOUT(interpreter), str);
+ ret=PIO_putps(interpreter,
+ new_io_pmc(interpreter, PIO_STDOUT(interpreter)), str);
}
else {
/* Be nice about this...
@@ -725,7 +745,8 @@
if(interpreter) {
str=Parrot_vsprintf_c(interpreter, s, args);
- ret=PIO_putps(interpreter, PIO_STDERR(interpreter), str);
+ ret=PIO_putps(interpreter,
+ new_io_pmc(interpreter, PIO_STDERR(interpreter)), str);
}
else {
/* Be nice about this...
@@ -740,9 +761,11 @@
}
INTVAL
-PIO_getfd(theINTERP, ParrotIO *io)
+PIO_getfd(theINTERP, PMC *pmc)
{
INTVAL i;
+ ParrotIO *io = PMC_data(pmc);
+
ParrotIOTable table = ((ParrotIOData*)interpreter->piodata)->table;
for(i = 0; i < PIO_NR_OPEN; i++) {
1.25 +7 -6 parrot/io/io_unix.c
Index: io_unix.c
===================================================================
RCS file: /cvs/public/parrot/io/io_unix.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -w -r1.24 -r1.25
--- io_unix.c 24 Mar 2003 07:29:01 -0000 1.24
+++ io_unix.c 1 Jul 2003 15:41:06 -0000 1.25
@@ -1,7 +1,7 @@
/* io_unix.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: io_unix.c,v 1.24 2003/03/24 07:29:01 leo Exp $
+ * $Id: io_unix.c,v 1.25 2003/07/01 15:41:06 dan Exp $
* Overview:
* This is the Parrot IO UNIX layer. May be changed to
* include other platforms if that platform is similar
@@ -89,13 +89,14 @@
ParrotIOData *d = GET_INTERP_IOD(interpreter);
if (d != NULL && d->table != NULL) {
if ((PIO_STDIN(interpreter) =
- PIO_unix_fdopen(interpreter, layer, STDIN_FILENO, PIO_F_READ))
+ PIO_unix_fdopen(interpreter, layer, STDIN_FILENO,
+ PIO_F_READ | PIO_F_SHARED))
&& (PIO_STDOUT(interpreter) =
PIO_unix_fdopen(interpreter, layer, STDOUT_FILENO,
- PIO_F_WRITE))
+ PIO_F_WRITE | PIO_F_SHARED))
&& (PIO_STDERR(interpreter) =
PIO_unix_fdopen(interpreter, layer, STDERR_FILENO,
- PIO_F_WRITE))
+ PIO_F_WRITE | PIO_F_SHARED))
)
return 0;
}
@@ -178,7 +179,7 @@
*/
if (PIO_unix_isatty(fd))
flags |= PIO_F_CONSOLE;
- io = PIO_new(interpreter, NULL, type, flags, mode);
+ io = PIO_new(interpreter, type, flags, mode);
io->fd = fd;
return io;
}
@@ -215,7 +216,7 @@
if (PIO_unix_isatty(fd))
flags |= PIO_F_CONSOLE;
- io = PIO_new(interpreter, NULL, PIO_F_FILE, flags, mode);
+ io = PIO_new(interpreter, PIO_F_FILE, flags, mode);
io->fd = fd;
return io;
}