From: Jarkko Hietaniemi Date: Tue, 11 Dec 2001 14:33:14 +0000 (+0000) Subject: Try to handle platforms that have O_TEXT != O_BINARY but X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6ce75a778d390cfc1b903c40f2566d0e560efcd8;p=p5sagit%2Fp5-mst-13.2.git Try to handle platforms that have O_TEXT != O_BINARY but which are not DOSish, BeOS being one of such platforms. Ideally this should be a Configure test, not a hardwired cpp symbol test... p4raw-id: //depot/perl@13621 --- diff --git a/doio.c b/doio.c index ed57c42..2577b2f 100644 --- a/doio.c +++ b/doio.c @@ -1107,7 +1107,11 @@ Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode) /* The old body of this is now in non-LAYER part of perlio.c * This is a stub for any XS code which might have been calling it. */ - char *name = (O_BINARY != O_TEXT && !(mode & O_BINARY)) ? ":crlf" : ":raw"; + char *name = ":raw"; +#ifdef PERLIO_CRLF + if (!(mode & O_BINARY))) + name = ":crlf"; +#endif return PerlIO_binmode(aTHX_ fp, iotype, mode, name); } diff --git a/perl.h b/perl.h index c3720a4..8f759d0 100644 --- a/perl.h +++ b/perl.h @@ -3925,6 +3925,18 @@ int flock(int fd, int op); # define O_TEXT 0 #endif +#if O_TEXT != O_BINARY + /* If you have different O_TEXT and O_BINARY and you are a CLRF shop, + * that is, you are somehow DOSish. */ +# if !defined(__BEOS__) +# define PERLIO_CLRF 1 +# else + /* If you have O_TEXT different from your O_BINARY but you still are + * not a CRLF shop. */ +# undef PERLIO_CLRF +# endif +#endif + #ifdef IAMSUID #ifdef I_SYS_STATVFS diff --git a/perlio.c b/perlio.c index 1fab7b7..9adeea7 100644 --- a/perlio.c +++ b/perlio.c @@ -859,14 +859,12 @@ void PerlIO_default_buffer(pTHX_ PerlIO_list_t *av) { PerlIO_funcs *tab = &PerlIO_perlio; - if (O_BINARY != O_TEXT) { - tab = &PerlIO_crlf; - } - else { - if (PerlIO_stdio.Set_ptrcnt) { - tab = &PerlIO_stdio; - } - } +#ifdef PERLIO_CRLF + tab = &PerlIO_crlf; +#endif + if (PerlIO_stdio.Set_ptrcnt) + tab = &PerlIO_stdio; +#else PerlIO_debug("Pushing %s\n", tab->name); PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0), &PL_sv_undef); @@ -1078,7 +1076,8 @@ PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names) /* Can't flush if switching encodings. */ if (!(names && memEQ(names, ":encoding(", 10))) { PerlIO_flush(f); - if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY))) { +#ifdef PERLIO_CRLF + if (!names && (mode & O_BINARY)) { PerlIO *top = f; while (*top) { if (PerlIOBase(top)->tab == &PerlIO_crlf) { @@ -1089,6 +1088,7 @@ PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names) PerlIO_flush(top); } } +#endif } return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE; } @@ -1781,7 +1781,7 @@ PerlIO_modestr(PerlIO *f, char *buf) *s++ = '+'; } } -#if O_TEXT != O_BINARY +#ifdef PERLIO_CRLF if (!(flags & PERLIO_F_CRLF)) *s++ = 'b'; #endif @@ -2367,9 +2367,9 @@ PerlIOStdio_mode(const char *mode, char *tmode) while (*mode) { *tmode++ = *mode++; } - if (O_BINARY != O_TEXT) { - *tmode++ = 'b'; - } +#ifdef PERLIO_CRLF + *tmode++ = 'b'; +#endif *tmode = '\0'; return ret; } @@ -2906,7 +2906,7 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, return NULL; } else { fd = PerlIO_fileno(f); -#if (O_BINARY != O_TEXT) && !defined(__BEOS__) +#ifdef PERLIO_CRLF /* * do something about failing setmode()? --jhi */ diff --git a/perliol.h b/perliol.h index d133061..4be2fbf 100644 --- a/perliol.h +++ b/perliol.h @@ -111,7 +111,7 @@ extern PerlIO *PerlIO_allocate(pTHX); extern SV *PerlIO_arg_fetch(PerlIO_list_t *av, IV n); #define PerlIOArg PerlIO_arg_fetch(layers,n) -#if O_BINARY != O_TEXT +#ifdef PERLIO_CRLF #define PERLIO_STDTEXT "t" #else #define PERLIO_STDTEXT ""