X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perlio.c;h=bd421c6780f8d0e3973c9a40f8944411a1606485;hb=a5262162c2c854ee96768d32ed06a8df25b95505;hp=278dde1991db3bef64811e2bea81b46e6da2fdf2;hpb=7d59b7e40bca518078f3e97c802950b76d52efa2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perlio.c b/perlio.c index 278dde1..bd421c6 100644 --- a/perlio.c +++ b/perlio.c @@ -520,7 +520,7 @@ PerlIO_stdstreams() } PerlIO * -PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode) +PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode,const char *arg,STRLEN len) { dTHX; PerlIOl *l = NULL; @@ -532,7 +532,7 @@ PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode) l->tab = tab; *f = l; PerlIO_debug("PerlIO_push f=%p %s %s\n",f,tab->name,(mode) ? mode : "(Null)"); - if ((*l->tab->Pushed)(f,mode) != 0) + if ((*l->tab->Pushed)(f,mode,arg,len) != 0) { PerlIO_pop(f); return NULL; @@ -556,8 +556,24 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names) if (*s) { const char *e = s; + const char *as = Nullch; + const char *ae = Nullch; + int count = 0; while (*e && *e != ':' && !isSPACE(*e)) - e++; + { + if (*e == '(') + { + if (!as) + as = e; + count++; + } + else if (*e == ')') + { + if (as && --count == 0) + ae = e; + } + e++; + } if (e > s) { if ((e - s) == 3 && strncmp(s,"raw",3) == 0) @@ -582,19 +598,20 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names) } else { - SV *layer = PerlIO_find_layer(s,e-s); + STRLEN len = ((as) ? as : e)-s; + SV *layer = PerlIO_find_layer(s,len); if (layer) { PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer))); if (tab) { - PerlIO *new = PerlIO_push(f,tab,mode); - if (!new) + len = (as) ? (ae-(as++)-1) : 0; + if (!PerlIO_push(f,tab,mode,as,len)) return -1; } } else - Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)(e-s),s); + Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)len,s); } } s = e; @@ -614,7 +631,7 @@ PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names) { PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n", f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)"); - if (!names || (O_TEXT != O_BINARY && (mode & O_BINARY))) + if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY))) { PerlIO *top = f; PerlIOl *l; @@ -704,7 +721,7 @@ PerlIO_reopen(const char *path, const char *mode, PerlIO *f) PerlIO_flush(f); if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0) { - if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0) + if ((*PerlIOBase(f)->tab->Pushed)(f,mode,Nullch,0) == 0) return f; } return NULL; @@ -964,7 +981,7 @@ PerlIO_modestr(PerlIO *f,char *buf) } IV -PerlIOBase_pushed(PerlIO *f, const char *mode) +PerlIOBase_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len) { PerlIOl *l = PerlIOBase(f); const char *omode = mode; @@ -1049,7 +1066,7 @@ PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count) return 0; } #else - PerlIO_push(f,&PerlIO_pending,"r"); + PerlIO_push(f,&PerlIO_pending,"r",Nullch,0); return PerlIOBuf_unread(f,vbuf,count); #endif } @@ -1204,7 +1221,7 @@ PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode) int oflags = PerlIOUnix_oflags(mode); if (oflags != -1) { - PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOUnix); + PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOUnix); s->fd = fd; s->oflags = oflags; PerlIOBase(f)->flags |= PERLIO_F_OPEN; @@ -1224,7 +1241,7 @@ PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode) int fd = PerlLIO_open3(path,oflags,0666); if (fd >= 0) { - PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOUnix); + PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOUnix); s->fd = fd; s->oflags = oflags; PerlIOBase(f)->flags |= PERLIO_F_OPEN; @@ -1428,7 +1445,7 @@ PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode) } if (stdio) { - PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOStdio); + PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOStdio); s->stdio = stdio; } } @@ -1443,7 +1460,7 @@ PerlIO_importFILE(FILE *stdio, int fl) PerlIO *f = NULL; if (stdio) { - PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"r+"),PerlIOStdio); + PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"r+",Nullch,0),PerlIOStdio); s->stdio = stdio; } return f; @@ -1459,7 +1476,7 @@ PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode) { char tmode[8]; PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX), self, - (mode = PerlIOStdio_mode(mode,tmode))), + (mode = PerlIOStdio_mode(mode,tmode)),Nullch,0), PerlIOStdio); s->stdio = stdio; } @@ -1783,11 +1800,11 @@ PerlIO_releaseFILE(PerlIO *p, FILE *f) /* perlio buffer layer */ IV -PerlIOBuf_pushed(PerlIO *f, const char *mode) +PerlIOBuf_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len) { PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); b->posn = PerlIO_tell(PerlIONext(f)); - return PerlIOBase_pushed(f,mode); + return PerlIOBase_pushed(f,mode,arg,len); } PerlIO * @@ -1809,7 +1826,7 @@ PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode) f = (*tab->Fdopen)(tab,fd,mode); if (f) { - PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf); + PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode,Nullch,0),PerlIOBuf); if (init && fd == 2) { /* Initial stderr is unbuffered */ @@ -1830,7 +1847,7 @@ PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode) PerlIO *f = (*tab->Open)(tab,path,mode); if (f) { - PerlIO_push(f,self,mode); + PerlIO_push(f,self,mode,Nullch,0); } return f; } @@ -1841,7 +1858,7 @@ PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f) PerlIO *next = PerlIONext(f); int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next); if (code = 0) - code = (*PerlIOBase(f)->tab->Pushed)(f,mode); + code = (*PerlIOBase(f)->tab->Pushed)(f,mode,Nullch,0); return code; } @@ -1856,7 +1873,8 @@ PerlIOBuf_flush(PerlIO *f) if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) { /* write() the buffer */ - STDCHAR *p = b->buf; + STDCHAR *buf = b->buf; + STDCHAR *p = buf; int count; PerlIO *n = PerlIONext(f); while (p < b->ptr) @@ -1873,12 +1891,13 @@ PerlIOBuf_flush(PerlIO *f) break; } } - b->posn += (p - b->buf); + b->posn += (p - buf); } else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) { + STDCHAR *buf = PerlIO_get_base(f); /* Note position change */ - b->posn += (b->ptr - b->buf); + b->posn += (b->ptr - buf); if (b->ptr < b->end) { /* We did not consume all of it */ @@ -1913,6 +1932,9 @@ PerlIOBuf_fill(PerlIO *f) if (PerlIO_flush(f) != 0) return -1; + if (!b->buf) + PerlIO_get_base(f); /* allocate via vtable */ + b->ptr = b->end = b->buf; if (PerlIO_fast_gets(n)) { @@ -2291,9 +2313,9 @@ PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) } IV -PerlIOPending_pushed(PerlIO *f,const char *mode) +PerlIOPending_pushed(PerlIO *f,const char *mode,const char *arg,STRLEN len) { - IV code = PerlIOBuf_pushed(f,mode); + IV code = PerlIOBuf_pushed(f,mode,arg,len); PerlIOl *l = PerlIOBase(f); /* Our PerlIO_fast_gets must match what we are pushed on, or sv_gets() etc. get muddled when it changes mid-string @@ -2364,11 +2386,11 @@ typedef struct } PerlIOCrlf; IV -PerlIOCrlf_pushed(PerlIO *f, const char *mode) +PerlIOCrlf_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len) { IV code; PerlIOBase(f)->flags |= PERLIO_F_CRLF; - code = PerlIOBuf_pushed(f,mode); + code = PerlIOBuf_pushed(f,mode,arg,len); #if 0 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n", f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)", @@ -2732,12 +2754,15 @@ PerlIOMmap_map(PerlIO *f) } posn = (b->posn / page_size) * page_size; len = st.st_size - posn; - m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn); + m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn); if (m->mptr && m->mptr != (Mmap_t) -1) { -#if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL) +#if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL) madvise(m->mptr, len, MADV_SEQUENTIAL); #endif +#if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED) + madvise(m->mptr, len, MADV_WILLNEED); +#endif PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF; b->end = ((STDCHAR *)m->mptr) + len; b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn); @@ -3119,7 +3144,7 @@ PerlIO_tmpfile(void) FILE *stdio = PerlSIO_tmpfile(); if (stdio) { - PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"w+"),PerlIOStdio); + PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"w+",Nullch,0),PerlIOStdio); s->stdio = stdio; } return f;