diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 2000-11-26 00:01:26 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2000-11-26 00:01:26 +0000 |
commit | 9d4164a33f49129f962ea484086b4b733e987ba7 (patch) | |
tree | 8807ca6f69e3edd267cb582ce7e53f4677a5eaa3 | |
parent | c3564e5c35b594706ecb001261b86a47fb837059 (diff) | |
parent | 0727cc217546946a8c8db12875c3cacb5833e494 (diff) | |
download | perl-9d4164a33f49129f962ea484086b4b733e987ba7.tar.gz |
Integrate perlio:
[ 7860]
Correct relative path from new ext\Filter\Util\Call location
back to miniperl.
[ 7857]
All tests pass on Win32/gcc/USE_PERLIO.
- when crlf layer is pushed make unix-level binary.
- remove :crlf injection in pp_backtick in pp_sys.c
- (Change dependacy of extension .dll's to perldll.def rather than perl.exe)
[ 7853]
Re-arrange crlf vs binary for platforms that care.
crlf layer is now "the" buffer layer and can turn its behaviour on/off.
Lip-service to making stdio layer work on such platforms (untested).
Now fails 3 tests rather than one, checkin to see if I can debug
the issue under linux. (Do not merge.)
p4raw-link: @7860 on //depot/perlio: 0727cc217546946a8c8db12875c3cacb5833e494
p4raw-link: @7857 on //depot/perlio: a77df51f3c9319336e0ec43ad003b02a0111d2af
p4raw-link: @7853 on //depot/perlio: f5b9d040829bb5deb93173e35ee6c82ce0a01c37
p4raw-id: //depot/perl@7861
-rw-r--r-- | doio.c | 12 | ||||
-rw-r--r-- | perlio.c | 347 | ||||
-rw-r--r-- | perliol.h | 22 | ||||
-rw-r--r-- | pp_sys.c | 6 | ||||
-rw-r--r-- | win32/makefile.mk | 95 |
5 files changed, 308 insertions, 174 deletions
@@ -463,13 +463,17 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw, #endif } if (saveifp) { /* must use old fp? */ + /* If fd is less that PL_maxsysfd i.e. STDIN..STDERR + then dup the new fileno down + */ fd = PerlIO_fileno(saveifp); if (saveofp) { - PerlIO_flush(saveofp); /* emulate PerlIO_close() */ + PerlIO_flush(saveofp); /* emulate PerlIO_close() */ if (saveofp != saveifp) { /* was a socket? */ PerlIO_close(saveofp); + /* This looks very suspect - NI-S 24 Nov 2000 */ if (fd > 2) - Safefree(saveofp); + Safefree(saveofp); /* ??? */ } } if (fd != PerlIO_fileno(fp)) { @@ -517,9 +521,6 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } } } - else if (O_BINARY != O_TEXT && IoTYPE(io) != IoTYPE_STD && !saveifp) { - type = ":crlf"; - } } if (type) { while (isSPACE(*type)) type++; @@ -2039,3 +2040,4 @@ Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) #endif /* SYSV IPC */ + @@ -42,12 +42,12 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names) } int -PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) +perlsio_binmode(FILE *fp, int iotype, int mode) { /* This used to be contents of do_binmode in doio.c */ #ifdef DOSISH # if defined(atarist) || defined(__MINT__) - if (!PerlIO_flush(fp)) { + if (!fflush(fp)) { if (mode & O_BINARY) ((FILE*)fp)->_flag |= _IOBIN; else @@ -56,7 +56,7 @@ PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) } return 0; # else - if (PerlLIO_setmode(PerlIO_fileno(fp), mode) != -1) { + if (PerlLIO_setmode(fileno(fp), mode) != -1) { # if defined(WIN32) && defined(__BORLANDC__) /* The translation mode of the stream is maintained independent * of the translation mode of the fd in the Borland RTL (heavy @@ -64,11 +64,11 @@ PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) * set the mode explicitly for the stream (though they don't * document this anywhere). GSAR 97-5-24 */ - PerlIO_seek(fp,0L,0); + fseek(fp,0L,0); if (mode & O_BINARY) - ((FILE*)fp)->flags |= _F_BIN; + fp->flags |= _F_BIN; else - ((FILE*)fp)->flags &= ~ _F_BIN; + fp->flags &= ~ _F_BIN; # endif return 1; } @@ -87,8 +87,11 @@ PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) #endif } - - +int +PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) +{ + return perlsio_binmode(fp,iotype,mode); +} #endif @@ -268,6 +271,7 @@ PerlIO_pop(PerlIO *f) PerlIOl *l = *f; if (l) { + PerlIO_debug(__FUNCTION__ " f=%p %s\n",f,l->tab->name); (*l->tab->Popped)(f); *f = l->next; Safefree(l); @@ -460,14 +464,21 @@ PerlIO_default_layer(I32 n) len = av_len(PerlIO_layer_av); if (len < 1) { - if (PerlIO_stdio.Set_ptrcnt) + if (O_BINARY != O_TEXT) { - av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0))); + av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_crlf.name,0))); } else - { - av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0))); - } + { + if (PerlIO_stdio.Set_ptrcnt) + { + av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0))); + } + else + { + av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0))); + } + } len = av_len(PerlIO_layer_av); } if (n < 0) @@ -490,9 +501,9 @@ PerlIO_stdstreams() if (!_perlio) { PerlIO_allocate(); - PerlIO_fdopen(0,"Ir"); - PerlIO_fdopen(1,"Iw"); - PerlIO_fdopen(2,"Iw"); + PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT); + PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT); + PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT); } } @@ -507,6 +518,7 @@ PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode) l->next = *f; l->tab = tab; *f = l; + PerlIO_debug(__FUNCTION__ " f=%p %s %s\n",f,tab->name,(mode) ? mode : "(Null)"); if ((*l->tab->Pushed)(f,mode) != 0) { PerlIO_pop(f); @@ -577,26 +589,36 @@ PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names) /* Given the abstraction above the public API functions */ int -PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names) +PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names) { + PerlIO_debug(__FUNCTION__ " 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)) { - PerlIO *top = fp; + PerlIO *top = f; PerlIOl *l; while (l = *top) { if (PerlIOBase(top)->tab == &PerlIO_crlf) { PerlIO_flush(top); - PerlIO_pop(top); + PerlIOBase(top)->flags &= ~PERLIO_F_CRLF; break; } top = PerlIONext(top); } } - return PerlIO_apply_layers(aTHX_ fp, NULL, names) == 0 ? TRUE : FALSE; + return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE; +} + +#undef PerlIO__close +int +PerlIO__close(PerlIO *f) +{ + return (*PerlIOBase(f)->tab->Close)(f); } + #undef PerlIO_close int PerlIO_close(PerlIO *f) @@ -750,7 +772,8 @@ PerlIO_error(PerlIO *f) void PerlIO_clearerr(PerlIO *f) { - (*PerlIOBase(f)->tab->Clearerr)(f); + if (f && *f) + (*PerlIOBase(f)->tab->Clearerr)(f); } #undef PerlIO_setlinebuf @@ -858,24 +881,43 @@ PerlIOBase_fileno(PerlIO *f) return PerlIO_fileno(PerlIONext(f)); } +char * +PerlIO_modestr(PerlIO *f,char *buf) +{ + char *s = buf; + IV flags = PerlIOBase(f)->flags; + if (flags & PERLIO_F_CANREAD) + *s++ = 'r'; + if (flags & PERLIO_F_CANWRITE) + *s++ = 'w'; + if (flags & PERLIO_F_CRLF) + *s++ = 't'; + else + *s++ = 'b'; + *s = '\0'; + return buf; +} + IV PerlIOBase_pushed(PerlIO *f, const char *mode) { PerlIOl *l = PerlIOBase(f); + const char *omode = mode; + char temp[8]; l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE| - PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY); + PERLIO_F_TRUNCATE|PERLIO_F_APPEND); if (mode) { switch (*mode++) { case 'r': - l->flags = PERLIO_F_CANREAD; + l->flags |= PERLIO_F_CANREAD; break; case 'a': - l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE; + l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE; break; case 'w': - l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE; + l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE; break; default: errno = EINVAL; @@ -889,7 +931,10 @@ PerlIOBase_pushed(PerlIO *f, const char *mode) l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE; break; case 'b': - l->flags |= PERLIO_F_BINARY; + l->flags &= ~PERLIO_F_CRLF; + break; + case 't': + l->flags |= PERLIO_F_CRLF; break; default: errno = EINVAL; @@ -902,10 +947,12 @@ PerlIOBase_pushed(PerlIO *f, const char *mode) if (l->next) { l->flags |= l->next->flags & - (PERLIO_F_CANREAD|PERLIO_F_CANWRITE| - PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY); + (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND); } } + PerlIO_debug(__FUNCTION__ " f=%p %s %s fl=%08x (%s)\n", + f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)", + l->flags,PerlIO_modestr(f,temp)); return 0; } @@ -943,9 +990,10 @@ IV PerlIOBase_close(PerlIO *f) { IV code = 0; + PerlIO *n = PerlIONext(f); if (PerlIO_flush(f) != 0) code = -1; - if (PerlIO_close(PerlIONext(f)) != 0) + if (n && (*PerlIOBase(n)->tab->Close)(n) != 0) code = -1; PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN); return code; @@ -976,7 +1024,10 @@ PerlIOBase_clearerr(PerlIO *f) { if (f && *f) { - PerlIOBase(f)->flags &= ~PERLIO_F_ERROR; + PerlIO *n = PerlIONext(f); + PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF); + if (n) + PerlIO_clearerr(n); } } @@ -1035,7 +1086,14 @@ PerlIOUnix_oflags(const char *mode) } if (*mode == 'b') { - oflags |= O_BINARY; + oflags |= O_BINARY; + oflags &= ~O_TEXT; + mode++; + } + else if (*mode == 't') + { + oflags |= O_TEXT; + oflags &= ~O_BINARY; mode++; } /* Always open in binary mode */ @@ -1187,7 +1245,7 @@ PerlIOUnix_close(PerlIO *f) PerlIO_funcs PerlIO_unix = { "unix", sizeof(PerlIOUnix), - 0, + PERLIO_K_RAW, PerlIOUnix_fileno, PerlIOUnix_fdopen, PerlIOUnix_open, @@ -1228,12 +1286,29 @@ PerlIOStdio_fileno(PerlIO *f) return fileno(PerlIOSelf(f,PerlIOStdio)->stdio); } +const char * +PerlIOStdio_mode(const char *mode,char *tmode) +{ + const char *ret = mode; + if (O_BINARY != O_TEXT) + { + ret = (const char *) tmode; + while (*mode) + { + *tmode++ = *mode++; + } + *tmode++ = 'b'; + *tmode = '\0'; + } + return ret; +} PerlIO * PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode) { PerlIO *f = NULL; int init = 0; + char tmode[8]; if (*mode == 'I') { init = 1; @@ -1258,7 +1333,9 @@ PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode) } } else - stdio = fdopen(fd,mode); + { + stdio = fdopen(fd,mode = PerlIOStdio_mode(mode,tmode)); + } if (stdio) { PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio); @@ -1288,7 +1365,10 @@ PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode) FILE *stdio = fopen(path,mode); if (stdio) { - PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio); + char tmode[8]; + PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(), self, + (mode = PerlIOStdio_mode(mode,tmode))), + PerlIOStdio); s->stdio = stdio; } return f; @@ -1298,7 +1378,8 @@ int PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f) { PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio); - FILE *stdio = freopen(path,mode,s->stdio); + char tmode[8]; + FILE *stdio = freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio); if (!s->stdio) return -1; s->stdio = stdio; @@ -1517,7 +1598,7 @@ PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt) PerlIO_funcs PerlIO_stdio = { "stdio", sizeof(PerlIOStdio), - 0, + PERLIO_K_BUFFERED, PerlIOStdio_fileno, PerlIOStdio_fdopen, PerlIOStdio_open, @@ -1594,15 +1675,23 @@ PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode) init = 1; mode++; } + if (O_BINARY != O_TEXT) + { + int code = PerlLIO_setmode(fd, O_BINARY); + PerlIO_debug(__FUNCTION__ " %s fd=%d m=%s c=%d\n",tab->name,fd,mode,code); + } f = (*tab->Fdopen)(tab,fd,mode); if (f) { - /* Initial stderr is unbuffered */ - if (!init || fd != 2) + PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf); + b->posn = PerlIO_tell(PerlIONext(f)); + if (init && fd == 2) { - PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf); - b->posn = PerlIO_tell(PerlIONext(f)); - } + /* Initial stderr is unbuffered */ + PerlIOBase(f)->flags |= PERLIO_F_UNBUF; + } + PerlIO_debug(__FUNCTION__ " %s f=%p fd=%d m=%s fl=%08x\n", + self->name,f,fd,mode,PerlIOBase(f)->flags); } return f; } @@ -1614,7 +1703,7 @@ PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode) PerlIO *f = (*tab->Open)(tab,path,mode); if (f) { - PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf); + PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf); b->posn = PerlIO_tell(PerlIONext(f)); } return f; @@ -1872,6 +1961,8 @@ PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count) if (b->ptr >= (b->buf + b->bufsiz)) PerlIO_flush(f); } + if (PerlIOBase(f)->flags & PERLIO_F_UNBUF) + PerlIO_flush(f); return written; } @@ -1994,7 +2085,7 @@ PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) PerlIO_funcs PerlIO_perlio = { "perlio", sizeof(PerlIOBuf), - 0, + PERLIO_K_BUFFERED, PerlIOBase_fileno, PerlIOBuf_fdopen, PerlIOBuf_open, @@ -2033,56 +2124,74 @@ typedef struct STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */ } PerlIOCrlf; +IV +PerlIOCrlf_pushed(PerlIO *f, const char *mode) +{ + IV code; + PerlIOBase(f)->flags |= PERLIO_F_CRLF; + code = PerlIOBase_pushed(f,mode); + PerlIO_debug(__FUNCTION__ " f=%p %s %s fl=%08x\n", + f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)", + PerlIOBase(f)->flags); + return code; +} + + SSize_t PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count) { - const STDCHAR *buf = (const STDCHAR *) vbuf+count; - PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf); - SSize_t unread = 0; - if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) - PerlIO_flush(f); if (c->nl) { *(c->nl) = 0xd; c->nl = NULL; } - if (!b->buf) - PerlIO_get_base(f); - if (b->buf) + if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) + return PerlIOBuf_unread(f,vbuf,count); + else { - if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) - { - b->end = b->ptr = b->buf + b->bufsiz; - PerlIOBase(f)->flags |= PERLIO_F_RDBUF; - } - while (count > 0 && b->ptr > b->buf) + const STDCHAR *buf = (const STDCHAR *) vbuf+count; + PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); + SSize_t unread = 0; + if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) + PerlIO_flush(f); + if (!b->buf) + PerlIO_get_base(f); + if (b->buf) { - int ch = *--buf; - if (ch == '\n') + if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) + { + b->end = b->ptr = b->buf + b->bufsiz; + PerlIOBase(f)->flags |= PERLIO_F_RDBUF; + } + while (count > 0 && b->ptr > b->buf) { - if (b->ptr - 2 >= b->buf) + int ch = *--buf; + if (ch == '\n') { - *--(b->ptr) = 0xa; - *--(b->ptr) = 0xd; - unread++; - count--; + if (b->ptr - 2 >= b->buf) + { + *--(b->ptr) = 0xa; + *--(b->ptr) = 0xd; + unread++; + count--; + } + else + { + buf++; + break; + } } else { - buf++; - break; + *--(b->ptr) = ch; + unread++; + count--; } } - else - { - *--(b->ptr) = ch; - unread++; - count--; - } } + return unread; } - return unread; } SSize_t @@ -2094,7 +2203,7 @@ PerlIOCrlf_get_cnt(PerlIO *f) if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) { PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf); - if (!c->nl) + if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl) { STDCHAR *nl = b->ptr; scan: @@ -2155,6 +2264,7 @@ PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) { PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf); + IV flags = PerlIOBase(f)->flags; if (!b->buf) PerlIO_get_base(f); if (!ptr) @@ -2164,7 +2274,7 @@ PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) else { ptr = b->end; - if (ptr > b->buf && ptr[-1] == 0xd) + if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd) ptr--; } ptr -= cnt; @@ -2178,7 +2288,7 @@ PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) else { chk = b->end; - if (chk > b->buf && chk[-1] == 0xd) + if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd) chk--; } chk -= cnt; @@ -2186,8 +2296,8 @@ PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) if (ptr != chk) { dTHX; - Perl_croak(aTHX_ "ptr wrong %p != %p nl=%p e=%p for %d", - ptr, chk, c->nl, b->end, cnt); + Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08x nl=%p e=%p for %d", + ptr, chk, flags, c->nl, b->end, cnt); } } if (c->nl) @@ -2207,52 +2317,59 @@ PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt) SSize_t PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count) { - PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); - const STDCHAR *buf = (const STDCHAR *) vbuf; - const STDCHAR *ebuf = buf+count; - if (!b->buf) - PerlIO_get_base(f); - if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) - return 0; - while (buf < ebuf) + if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) + return PerlIOBuf_write(f,vbuf,count); + else { - STDCHAR *eptr = b->buf+b->bufsiz; - PerlIOBase(f)->flags |= PERLIO_F_WRBUF; - while (buf < ebuf && b->ptr < eptr) + PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf); + const STDCHAR *buf = (const STDCHAR *) vbuf; + const STDCHAR *ebuf = buf+count; + if (!b->buf) + PerlIO_get_base(f); + if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) + return 0; + while (buf < ebuf) { - if (*buf == '\n') + STDCHAR *eptr = b->buf+b->bufsiz; + PerlIOBase(f)->flags |= PERLIO_F_WRBUF; + while (buf < ebuf && b->ptr < eptr) { - if ((b->ptr + 2) > eptr) - { - /* Not room for both */ - PerlIO_flush(f); - break; - } - else + if (*buf == '\n') { - *(b->ptr)++ = 0xd; /* CR */ - *(b->ptr)++ = 0xa; /* LF */ - buf++; - if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) + if ((b->ptr + 2) > eptr) { + /* Not room for both */ PerlIO_flush(f); break; } + else + { + *(b->ptr)++ = 0xd; /* CR */ + *(b->ptr)++ = 0xa; /* LF */ + buf++; + if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) + { + PerlIO_flush(f); + break; + } + } + } + else + { + int ch = *buf++; + *(b->ptr)++ = ch; + } + if (b->ptr >= eptr) + { + PerlIO_flush(f); + break; } - } - else - { - int ch = *buf++; - *(b->ptr)++ = ch; - } - if (b->ptr >= eptr) - { - PerlIO_flush(f); - break; } } + if (PerlIOBase(f)->flags & PERLIO_F_UNBUF) + PerlIO_flush(f); + return (buf - (STDCHAR *) vbuf); } - return (buf - (STDCHAR *) vbuf); } IV @@ -2270,12 +2387,12 @@ PerlIOCrlf_flush(PerlIO *f) PerlIO_funcs PerlIO_crlf = { "crlf", sizeof(PerlIOCrlf), - 0, + PERLIO_K_BUFFERED|PERLIO_K_CANCRLF, PerlIOBase_fileno, PerlIOBuf_fdopen, PerlIOBuf_open, PerlIOBuf_reopen, - PerlIOBase_pushed, + PerlIOCrlf_pushed, PerlIOBase_noop_ok, /* popped */ PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */ PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */ @@ -2573,7 +2690,7 @@ PerlIOMmap_close(PerlIO *f) PerlIO_funcs PerlIO_mmap = { "mmap", sizeof(PerlIOMmap), - 0, + PERLIO_K_BUFFERED, PerlIOBase_fileno, PerlIOBuf_fdopen, PerlIOBuf_open, @@ -34,6 +34,13 @@ struct _PerlIO_funcs void (*Set_ptrcnt)(PerlIO *f,STDCHAR *ptr,SSize_t cnt); }; +/*--------------------------------------------------------------------------------------*/ +/* Kind values */ +#define PERLIO_K_RAW 0x00000001 +#define PERLIO_K_BUFFERED 0x00000002 +#define PERLIO_K_CANCRLF 0x00000004 + +/*--------------------------------------------------------------------------------------*/ struct _PerlIO { PerlIOl * next; /* Lower layer */ @@ -50,13 +57,14 @@ struct _PerlIO #define PERLIO_F_ERROR 0x00080000 #define PERLIO_F_TRUNCATE 0x00100000 #define PERLIO_F_APPEND 0x00200000 -#define PERLIO_F_BINARY 0x00400000 +#define PERLIO_F_CRLF 0x00400000 #define PERLIO_F_UTF8 0x00800000 -#define PERLIO_F_LINEBUF 0x01000000 +#define PERLIO_F_UNBUF 0x01000000 #define PERLIO_F_WRBUF 0x02000000 #define PERLIO_F_RDBUF 0x04000000 -#define PERLIO_F_TEMP 0x08000000 -#define PERLIO_F_OPEN 0x10000000 +#define PERLIO_F_LINEBUF 0x08000000 +#define PERLIO_F_TEMP 0x10000000 +#define PERLIO_F_OPEN 0x20000000 #define PerlIOBase(f) (*(f)) #define PerlIOSelf(f,type) ((type *)PerlIOBase(f)) @@ -74,6 +82,12 @@ extern PerlIO_funcs PerlIO_mmap; extern PerlIO *PerlIO_allocate(void); +#if O_BINARY != O_TEXT +#define PERLIO_STDTEXT "t" +#else +#define PERLIO_STDTEXT "" +#endif + /*--------------------------------------------------------------------------------------*/ /* Generic, or stub layer functions */ @@ -301,9 +301,6 @@ PP(pp_backtick) if (PL_curcop->cop_io) { type = SvPV_nolen(PL_curcop->cop_io); } - else if (O_BINARY != O_TEXT) { - type = ":crlf"; - } if (type && *type) PerlIO_apply_layers(aTHX_ fp,mode,type); @@ -3732,9 +3729,6 @@ PP(pp_fork) if (childpid < 0) RETSETUNDEF; if (!childpid) { -#ifdef SOCKS_64BIT_BUG - Perl_do_s64_init_buffer(); -#endif /*SUPPRESS 560*/ if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV))) sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid()); diff --git a/win32/makefile.mk b/win32/makefile.mk index 681e28f401..fd9cdfa464 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -89,7 +89,7 @@ INST_ARCH *= \$(ARCHNAME) # # uncomment exactly one of the following -# +# # Visual C++ 2.x #CCTYPE *= MSVC20 # Visual C++ > 2.x and < 6.x @@ -290,7 +290,7 @@ ARCHNAME !:= $(ARCHNAME)-thread # VC 6.0 can load the socket dll on demand. Makes the test suite # run in about 10% less time. -DELAYLOAD *= -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib +DELAYLOAD *= -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib # VC 6.0 seems capable of compiling perl correctly with optimizations # enabled. Anything earlier fails tests. @@ -332,7 +332,7 @@ RSC = rc # Options # INCLUDES = -I$(COREDIR) -I.\include -I. -I.. -I"$(CCINCDIR)" -#PCHFLAGS = -H -Hc -H=c:\temp\bcmoduls.pch +#PCHFLAGS = -H -Hc -H=c:\temp\bcmoduls.pch DEFINES = -DWIN32 $(CRYPT_FLAG) LOCDEFS = -DPERLDLL -DPERL_CORE SUBSYS = console @@ -346,7 +346,7 @@ OPTIMIZE = -v -D_RTLDLL -DDEBUGGING LINK_DBG = -v .ELSE OPTIMIZE = -O2 -D_RTLDLL -LINK_DBG = +LINK_DBG = .ENDIF CFLAGS = -w -g0 -tWM -tWD $(INCLUDES) $(DEFINES) $(LOCDEFS) \ @@ -354,7 +354,7 @@ CFLAGS = -w -g0 -tWM -tWD $(INCLUDES) $(DEFINES) $(LOCDEFS) \ LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)" OBJOUT_FLAG = -o EXEOUT_FLAG = -e -LIBOUT_FLAG = +LIBOUT_FLAG = .ELIF "$(CCTYPE)" == "GCC" @@ -371,7 +371,7 @@ a = .a # Options # -INCLUDES = -I.\include -I. -I.. -I$(COREDIR) +INCLUDES = -I.\include -I. -I.. -I$(COREDIR) DEFINES = -DWIN32 $(CRYPT_FLAG) LOCDEFS = -DPERLDLL -DPERL_CORE SUBSYS = console @@ -391,14 +391,14 @@ OPTIMIZE = -g -O2 -DDEBUGGING LINK_DBG = -g .ELSE OPTIMIZE = -g -O2 -LINK_DBG = -g +LINK_DBG = -g .ENDIF CFLAGS = $(INCLUDES) $(DEFINES) $(LOCDEFS) $(OPTIMIZE) LINK_FLAGS = $(LINK_DBG) -L"$(INST_COREDIR)" -L"$(CCLIBDIR)" OBJOUT_FLAG = -o EXEOUT_FLAG = -o -LIBOUT_FLAG = +LIBOUT_FLAG = # NOTE: we assume that GCC uses MSVCRT.DLL BUILDOPT += -fno-strict-aliasing -DPERL_MSVCRT_READFIX @@ -415,7 +415,7 @@ RSC = rc # INCLUDES = -I$(COREDIR) -I.\include -I. -I.. -#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX +#PCHFLAGS = -Fpc:\temp\vcmoduls.pch -YX DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) LOCDEFS = -DPERLDLL -DPERL_CORE SUBSYS = console @@ -496,7 +496,7 @@ LKPOST = ) # # Rules -# +# .SUFFIXES : .c $(o) .dll $(a) .exe .rc .res @@ -515,7 +515,7 @@ $(o).dll: $(IMPLIB) --input-def $(*B).def --output-lib $(*B).a $@ .ELSE $(LINK32) -dll -subsystem:windows -implib:$(*B).lib -def:$(*B).def \ - -out:$@ $(BLINK_FLAGS) $(LIBFILES) $< $(LIBPERL) + -out:$@ $(BLINK_FLAGS) $(LIBFILES) $< $(LIBPERL) .ENDIF .rc.res: @@ -532,6 +532,13 @@ CONFIGPM = ..\lib\Config.pm MINIMOD = ..\lib\ExtUtils\Miniperl.pm X2P = ..\x2p\a2p.exe +# Nominate a target which causes extensions to be re-built +# This used to be $(PERLEXE), but at worst it is the .dll that they depend +# on and really only the interface - i.e. the .def file used to export symbols +# from the .dll +PERLDEP = perldll.def + + PL2BAT = bin\pl2bat.pl GLOBBAT = bin\perlglob.bat @@ -638,7 +645,7 @@ EXTRACORE_SRC += ..\perlio.c WIN32_SRC = \ .\win32.c \ .\win32sck.c \ - .\win32thread.c + .\win32thread.c .IF "$(CRYPT_SRC)" != "" WIN32_SRC += .\$(CRYPT_SRC) @@ -739,7 +746,7 @@ GLOB = $(EXTDIR)\File\Glob\Glob HOSTNAME = $(EXTDIR)\Sys\Hostname\Hostname STORABLE = $(EXTDIR)\Storable\Storable FILTER = $(EXTDIR)\Filter\Util\Call\Call -ENCODE = $(EXTDIR)\Encode\Encode +ENCODE = $(EXTDIR)\Encode\Encode SOCKET_DLL = $(AUTODIR)\Socket\Socket.dll FCNTL_DLL = $(AUTODIR)\Fcntl\Fcntl.dll @@ -857,7 +864,7 @@ RIGHTMAKE = __switch_makefiles NOOP = @rem .ELSE MK2 = __not_needed -RIGHTMAKE = +RIGHTMAKE = .ENDIF # @@ -913,7 +920,7 @@ __no_such_target: #--------------------- END Win95 SPECIFIC --------------------- # a blank target for when builds don't need to do certain things -# this target added for Win95 port but used to keep the WinNT port able to +# this target added for Win95 port but used to keep the WinNT port able to # use this file __not_needed: $(NOOP) @@ -927,7 +934,7 @@ $(GLOBEXE) : perlglob$(o) $(LINK32) $(BLINK_FLAGS) -mconsole -o $@ perlglob$(o) $(LIBFILES) .ELSE $(LINK32) $(BLINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \ - perlglob$(o) setargv$(o) + perlglob$(o) setargv$(o) .ENDIF perlglob$(o) : perlglob.c @@ -972,7 +979,7 @@ $(MINIPERL) : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS) @$(mktmp c0x32$(o) $(MINI_OBJ:s,\,\\),$(@:s,\,\\),,$(LIBFILES),) .ELIF "$(CCTYPE)" == "GCC" $(LINK32) -v -mconsole -o $@ $(BLINK_FLAGS) \ - $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST)) + $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST)) .ELSE $(LINK32) -subsystem:console -out:$@ \ @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(MINI_OBJ:s,\,\\)) @@ -1070,7 +1077,7 @@ $(X2P) : $(MINIPERL) $(X2P_OBJ) @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(X2P_OBJ:s,\,\\)) .ENDIF -perlmain.c : runperl.c +perlmain.c : runperl.c copy runperl.c perlmain.c perlmain$(o) : perlmain.c @@ -1091,7 +1098,7 @@ $(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) .ENDIF copy $(PERLEXE) $(WPERLEXE) $(MINIPERL) -I..\lib bin\exetype.pl $(WPERLEXE) WINDOWS - copy splittree.pl .. + copy splittree.pl .. $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" $(AUTODIR) $(DYNALOADER).c: $(MINIPERL) $(EXTDIR)\DynaLoader\dl_win32.xs $(CONFIGPM) @@ -1106,102 +1113,102 @@ $(DYNALOADER).c: $(MINIPERL) $(EXTDIR)\DynaLoader\dl_win32.xs $(CONFIGPM) $(EXTDIR)\DynaLoader\dl_win32.xs: dl_win32.xs copy dl_win32.xs $(EXTDIR)\DynaLoader\dl_win32.xs -$(DUMPER_DLL): $(PERLEXE) $(DUMPER).xs +$(DUMPER_DLL): $(PERLDEP) $(DUMPER).xs cd $(EXTDIR)\Data\$(*B) && \ ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\Data\$(*B) && $(MAKE) -$(DPROF_DLL): $(PERLEXE) $(DPROF).xs +$(DPROF_DLL): $(PERLDEP) $(DPROF).xs cd $(EXTDIR)\Devel\$(*B) && \ ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\Devel\$(*B) && $(MAKE) -$(GLOB_DLL): $(PERLEXE) $(GLOB).xs +$(GLOB_DLL): $(PERLDEP) $(GLOB).xs cd $(EXTDIR)\File\$(*B) && \ ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\File\$(*B) && $(MAKE) -$(PEEK_DLL): $(PERLEXE) $(PEEK).xs +$(PEEK_DLL): $(PERLDEP) $(PEEK).xs cd $(EXTDIR)\Devel\$(*B) && \ ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\Devel\$(*B) && $(MAKE) -$(RE_DLL): $(PERLEXE) $(RE).xs +$(RE_DLL): $(PERLDEP) $(RE).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(B_DLL): $(PERLEXE) $(B).xs +$(B_DLL): $(PERLDEP) $(B).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(THREAD_DLL): $(PERLEXE) $(THREAD).xs +$(THREAD_DLL): $(PERLDEP) $(THREAD).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(ATTRS_DLL): $(PERLEXE) $(ATTRS).xs +$(ATTRS_DLL): $(PERLDEP) $(ATTRS).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(POSIX_DLL): $(PERLEXE) $(POSIX).xs +$(POSIX_DLL): $(PERLDEP) $(POSIX).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(IO_DLL): $(PERLEXE) $(IO).xs +$(IO_DLL): $(PERLDEP) $(IO).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(SDBM_FILE_DLL) : $(PERLEXE) $(SDBM_FILE).xs +$(SDBM_FILE_DLL) : $(PERLDEP) $(SDBM_FILE).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(FCNTL_DLL): $(PERLEXE) $(FCNTL).xs +$(FCNTL_DLL): $(PERLDEP) $(FCNTL).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(OPCODE_DLL): $(PERLEXE) $(OPCODE).xs +$(OPCODE_DLL): $(PERLDEP) $(OPCODE).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs +$(SOCKET_DLL): $(PERLDEP) $(SOCKET).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(HOSTNAME_DLL): $(PERLEXE) $(HOSTNAME).xs +$(HOSTNAME_DLL): $(PERLDEP) $(HOSTNAME).xs cd $(EXTDIR)\Sys\$(*B) && \ ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\Sys\$(*B) && $(MAKE) -$(BYTELOADER_DLL): $(PERLEXE) $(BYTELOADER).xs +$(BYTELOADER_DLL): $(PERLDEP) $(BYTELOADER).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(ENCODE_DLL): $(PERLEXE) $(ENCODE).xs +$(ENCODE_DLL): $(PERLDEP) $(ENCODE).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(STORABLE_DLL): $(PERLEXE) $(STORABLE).xs +$(STORABLE_DLL): $(PERLDEP) $(STORABLE).xs cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) -$(FILTER_DLL): $(PERLEXE) $(FILTER).xs +$(FILTER_DLL): $(PERLDEP) $(FILTER).xs cd $(EXTDIR)\Filter\Util\Call && \ - ..\..\..\miniperl -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + ..\..\..\..\miniperl -I..\..\..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\Filter\Util\Call && $(MAKE) -$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL +$(ERRNO_PM): $(PERLDEP) $(ERRNO)_pm.PL cd $(EXTDIR)\$(*B) && \ ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) @@ -1274,7 +1281,7 @@ installhtml : doc $(RCOPY) html\*.* $(INST_HTML)\*.* inst_lib : $(CONFIGPM) - copy splittree.pl .. + copy splittree.pl .. $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" $(AUTODIR) $(RCOPY) ..\lib $(INST_LIB)\*.* @@ -1315,7 +1322,7 @@ test-wide-notty : test-prep set HARNESS_PERL_SWITCHES=-C && \ cd ..\t && $(PERLEXE) -I..\lib harness -clean : +clean : -@erase miniperlmain$(o) -@erase $(MINIPERL) -@erase perlglob$(o) @@ -1346,9 +1353,9 @@ ok: utils okfile: utils $(PERLEXE) -I..\lib ..\utils\perlbug -ok -s "(UNINSTALLED)" -F perl.ok - + nok: utils $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)" - + nokfile: utils $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok |