ext/re/hints/MSWin32.pl seems to be missing from perlio.
[p5sagit/p5-mst-13.2.git] / perlio.c
index 05f589a..7f2d66f 100644 (file)
--- a/perlio.c
+++ b/perlio.c
 #define PERL_IN_PERLIO_C
 #include "perl.h"
 
+#ifndef PERLIO_LAYERS
+int
+PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
+{
+ if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
+  {
+   return 0;
+  } 
+ Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
+ /* NOTREACHED */
+ return -1; 
+}
+#endif
+
 #if !defined(PERL_IMPLICIT_SYS)
 
 #ifdef PERLIO_IS_STDIO
@@ -208,30 +222,10 @@ PerlIO_pop(PerlIO *f)
   }
 }
 
-#undef PerlIO_close
-int
-PerlIO_close(PerlIO *f)
-{
- int code = (*PerlIOBase(f)->tab->Close)(f);
- while (*f)
-  {
-   PerlIO_pop(f);
-  }
- return code;
-}
-
-
 /*--------------------------------------------------------------------------------------*/
-/* Given the abstraction above the public API functions */
-
-#undef PerlIO_fileno
-int
-PerlIO_fileno(PerlIO *f)
-{
- return (*PerlIOBase(f)->tab->Fileno)(f);
-}
+/* XS Interface for perl code */
 
-XS(XS_io_import)
+XS(XS_perlio_import)
 {
  dXSARGS;
  GV *gv = CvGV(cv);
@@ -241,7 +235,7 @@ XS(XS_io_import)
  XSRETURN_EMPTY;
 }
 
-XS(XS_io_unimport)
+XS(XS_perlio_unimport)
 {
  dXSARGS;
  GV *gv = CvGV(cv);
@@ -252,7 +246,7 @@ XS(XS_io_unimport)
 }
 
 SV *
-PerlIO_find_layer(char *name, STRLEN len)
+PerlIO_find_layer(const char *name, STRLEN len)
 {
  dTHX;
  SV **svp;
@@ -271,7 +265,7 @@ perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
 {
  if (SvROK(sv))
   {
-   IO *io = GvIOn(SvRV(sv));
+   IO *io = GvIOn((GV *)SvRV(sv));
    PerlIO *ifp = IoIFP(io);
    PerlIO *ofp = IoOFP(io);
    AV *av = (AV *) mg->mg_obj;
@@ -285,7 +279,7 @@ perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
 {
  if (SvROK(sv))
   {
-   IO *io = GvIOn(SvRV(sv));
+   IO *io = GvIOn((GV *)SvRV(sv));
    PerlIO *ifp = IoIFP(io);
    PerlIO *ofp = IoOFP(io);
    AV *av = (AV *) mg->mg_obj;
@@ -333,7 +327,7 @@ XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
  for (i=2; i < items; i++)
   {
    STRLEN len;
-   char *name = SvPV(ST(i),len);
+   const char *name = SvPV(ST(i),len);
    SV *layer  = PerlIO_find_layer(name,len);
    if (layer)
     {
@@ -353,7 +347,7 @@ void
 PerlIO_define_layer(PerlIO_funcs *tab)
 {
  dTHX;
- HV *stash = gv_stashpv("io::Layer", TRUE);
+ HV *stash = gv_stashpv("perlio::Layer", TRUE);
  SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
  hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
 }
@@ -368,15 +362,18 @@ PerlIO_default_layer(I32 n)
  int len;
  if (!PerlIO_layer_hv)
   {
-   char *s  = PerlEnv_getenv("PERLIO");
-   newXS("io::import",XS_io_import,__FILE__);
-   newXS("io::unimport",XS_io_unimport,__FILE__);
+   const char *s  = PerlEnv_getenv("PERLIO");
+   newXS("perlio::import",XS_perlio_import,__FILE__);
+   newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
+#if 0
    newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
-   PerlIO_layer_hv = get_hv("io::layers",GV_ADD|GV_ADDMULTI);
-   PerlIO_layer_av = get_av("io::layers",GV_ADD|GV_ADDMULTI);
+#endif
+   PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
+   PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
    PerlIO_define_layer(&PerlIO_unix);
    PerlIO_define_layer(&PerlIO_perlio);
    PerlIO_define_layer(&PerlIO_stdio);
+   PerlIO_define_layer(&PerlIO_crlf);
 #ifdef HAS_MMAP
    PerlIO_define_layer(&PerlIO_mmap);
 #endif
@@ -389,10 +386,12 @@ PerlIO_default_layer(I32 n)
         s++;
        if (*s)
         {
-         char *e = s;
+         const char *e = s;
          SV *layer;
          while (*e && !isSPACE((unsigned char)*e))
           e++;
+         if (*s == ':')
+          s++;
          layer = PerlIO_find_layer(s,e-s);
          if (layer)
           {
@@ -430,6 +429,46 @@ PerlIO_default_layer(I32 n)
  return tab;
 }
 
+int
+PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
+{
+ if (names)
+  {
+   const char *s = names;
+   while (*s)
+    {
+     while (isSPACE(*s))
+      s++;
+     if (*s == ':')
+      s++;
+     if (*s)
+      {
+       const char *e = s;
+       while (*e && *e != ':' && !isSPACE(*e))
+        e++;
+       if (e > s)
+        {
+         SV *layer = PerlIO_find_layer(s,e-s);
+         if (layer)
+          {
+           PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
+           if (tab)
+            {
+             PerlIO *new = PerlIO_push(f,tab,mode);
+             if (!new)
+              return -1;
+            }
+          }
+         else
+          Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
+        }
+       s = e;
+      }
+    }
+  }
+ return 0;
+}
+
 #define PerlIO_default_top() PerlIO_default_layer(-1)
 #define PerlIO_default_btm() PerlIO_default_layer(0)
 
@@ -465,6 +504,30 @@ PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
  return f;
 }
 
+/*--------------------------------------------------------------------------------------*/
+/* Given the abstraction above the public API functions */
+
+#undef PerlIO_close
+int
+PerlIO_close(PerlIO *f)
+{
+ int code = (*PerlIOBase(f)->tab->Close)(f);
+ while (*f)
+  {
+   PerlIO_pop(f);
+  }
+ return code;
+}
+
+#undef PerlIO_fileno
+int
+PerlIO_fileno(PerlIO *f)
+{
+ return (*PerlIOBase(f)->tab->Fileno)(f);
+}
+
+
+
 #undef PerlIO_fdopen
 PerlIO *
 PerlIO_fdopen(int fd, const char *mode)
@@ -1791,6 +1854,40 @@ PerlIO_funcs PerlIO_perlio = {
  PerlIOBuf_set_ptrcnt,
 };
 
+/*--------------------------------------------------------------------------------------*/
+/* crlf - translation currently just a copy of perlio to prove
+   that extra buffering which real one will do is not an issue.
+ */
+
+PerlIO_funcs PerlIO_crlf = {
+ "crlf",
+ sizeof(PerlIOBuf),
+ 0,
+ PerlIOBase_fileno,
+ PerlIOBuf_fdopen,
+ PerlIOBuf_open,
+ PerlIOBuf_reopen,
+ PerlIOBase_pushed,
+ PerlIOBase_noop_ok,
+ PerlIOBuf_read,
+ PerlIOBuf_unread,
+ PerlIOBuf_write,
+ PerlIOBuf_seek,
+ PerlIOBuf_tell,
+ PerlIOBuf_close,
+ PerlIOBuf_flush,
+ PerlIOBuf_fill,
+ PerlIOBase_eof,
+ PerlIOBase_error,
+ PerlIOBase_clearerr,
+ PerlIOBuf_setlinebuf,
+ PerlIOBuf_get_base,
+ PerlIOBuf_bufsiz,
+ PerlIOBuf_get_ptr,
+ PerlIOBuf_get_cnt,
+ PerlIOBuf_set_ptrcnt,
+};
+
 #ifdef HAS_MMAP
 /*--------------------------------------------------------------------------------------*/
 /* mmap as "buffer" layer */