summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-12-11 14:33:14 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-12-11 14:33:14 +0000
commit772bf6a09dabb907d5599cd1b05494c174e5198d (patch)
tree852095faac15bf2d497b71c3f3e0f8056eb91709
parent06313c6a15bfdcf10349b63b4c9be1017beaeab3 (diff)
downloadperl-772bf6a09dabb907d5599cd1b05494c174e5198d.tar.gz
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
-rw-r--r--doio.c6
-rw-r--r--perl.h12
-rw-r--r--perlio.c28
-rw-r--r--perliol.h2
4 files changed, 32 insertions, 16 deletions
diff --git a/doio.c b/doio.c
index ed57c42ccc..2577b2f316 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 c3720a4741..8f759d06c1 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 1fab7b7aa4..9adeea7cd6 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 d133061fbd..4be2fbfcda 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 ""