perllocale.pod changes
[p5sagit/p5-mst-13.2.git] / perlio.c
index 1b5bd76..f5135ca 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -88,6 +88,8 @@ PerlIO_init(void)
 /* Implement all the PerlIO interface ourselves.
  */
 
+#include "perliol.h"
+
 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
 #ifdef I_UNISTD
 #include <unistd.h>
@@ -98,8 +100,7 @@ PerlIO_init(void)
 
 #include "XSUB.h"
 
-#undef printf
-void PerlIO_debug(char *fmt,...) __attribute__((format(printf,1,2)));
+void PerlIO_debug(char *fmt,...) __attribute__((format(__printf__,1,2)));
 
 void
 PerlIO_debug(char *fmt,...)
@@ -107,9 +108,9 @@ PerlIO_debug(char *fmt,...)
  static int dbg = 0;
  if (!dbg)
   {
-   char *s = getenv("PERLIO_DEBUG");
+   char *s = PerlEnv_getenv("PERLIO_DEBUG");
    if (s && *s)
-    dbg = open(s,O_WRONLY|O_CREAT|O_APPEND,0666);
+    dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
    else
     dbg = -1;
   }
@@ -128,7 +129,7 @@ PerlIO_debug(char *fmt,...)
    Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
 
    s = SvPV(sv,len);
-   write(dbg,s,len);
+   PerlLIO_write(dbg,s,len);
    va_end(ap);
    SvREFCNT_dec(sv);
   }
@@ -136,69 +137,6 @@ PerlIO_debug(char *fmt,...)
 
 /*--------------------------------------------------------------------------------------*/
 
-typedef struct _PerlIO_funcs PerlIO_funcs;
-struct _PerlIO_funcs
-{
- char *                name;
- Size_t                size;
- IV            kind;
- IV            (*Fileno)(PerlIO *f);
- PerlIO *      (*Fdopen)(PerlIO_funcs *tab, int fd, const char *mode);
- PerlIO *      (*Open)(PerlIO_funcs *tab, const char *path, const char *mode);
- int           (*Reopen)(const char *path, const char *mode, PerlIO *f);
- IV            (*Pushed)(PerlIO *f,const char *mode);
- IV            (*Popped)(PerlIO *f);
- /* Unix-like functions - cf sfio line disciplines */
- SSize_t       (*Read)(PerlIO *f, void *vbuf, Size_t count);
- SSize_t       (*Unread)(PerlIO *f, const void *vbuf, Size_t count);
- SSize_t       (*Write)(PerlIO *f, const void *vbuf, Size_t count);
- IV            (*Seek)(PerlIO *f, Off_t offset, int whence);
- Off_t         (*Tell)(PerlIO *f);
- IV            (*Close)(PerlIO *f);
- /* Stdio-like buffered IO functions */
- IV            (*Flush)(PerlIO *f);
- IV            (*Fill)(PerlIO *f);
- IV            (*Eof)(PerlIO *f);
- IV            (*Error)(PerlIO *f);
- void          (*Clearerr)(PerlIO *f);
- void          (*Setlinebuf)(PerlIO *f);
- /* Perl's snooping functions */
- STDCHAR *     (*Get_base)(PerlIO *f);
- Size_t                (*Get_bufsiz)(PerlIO *f);
- STDCHAR *     (*Get_ptr)(PerlIO *f);
- SSize_t       (*Get_cnt)(PerlIO *f);
- void          (*Set_ptrcnt)(PerlIO *f,STDCHAR *ptr,SSize_t cnt);
-};
-
-struct _PerlIO
-{
- PerlIOl *     next;       /* Lower layer */
- PerlIO_funcs *        tab;        /* Functions for this layer */
- IV            flags;      /* Various flags for state */
-};
-
-/*--------------------------------------------------------------------------------------*/
-
-/* Flag values */
-#define PERLIO_F_EOF           0x00010000
-#define PERLIO_F_CANWRITE      0x00020000
-#define PERLIO_F_CANREAD       0x00040000
-#define PERLIO_F_ERROR         0x00080000
-#define PERLIO_F_TRUNCATE      0x00100000
-#define PERLIO_F_APPEND                0x00200000
-#define PERLIO_F_BINARY                0x00400000
-#define PERLIO_F_UTF8          0x00800000
-#define PERLIO_F_LINEBUF       0x01000000
-#define PERLIO_F_WRBUF         0x02000000
-#define PERLIO_F_RDBUF         0x04000000
-#define PERLIO_F_TEMP          0x08000000
-#define PERLIO_F_OPEN          0x10000000
-
-#define PerlIOBase(f)      (*(f))
-#define PerlIOSelf(f,type) ((type *)PerlIOBase(f))
-#define PerlIONext(f)      (&(PerlIOBase(f)->next))
-
-/*--------------------------------------------------------------------------------------*/
 /* Inner level routines */
 
 /* Table of pointers to the PerlIO structs (malloc'ed) */
@@ -293,14 +231,6 @@ PerlIO_fileno(PerlIO *f)
  return (*PerlIOBase(f)->tab->Fileno)(f);
 }
 
-
-extern PerlIO_funcs PerlIO_unix;
-extern PerlIO_funcs PerlIO_perlio;
-extern PerlIO_funcs PerlIO_stdio;
-#ifdef HAS_MMAP
-extern PerlIO_funcs PerlIO_mmap;
-#endif
-
 XS(XS_perlio_import)
 {
  dXSARGS;
@@ -354,11 +284,11 @@ PerlIO_default_layer(I32 n)
  int len;
  if (!PerlIO_layer_hv)
   {
-   char *s  = getenv("PERLIO");
+   char *s  = PerlEnv_getenv("PERLIO");
    newXS("perlio::import",XS_perlio_import,__FILE__);
    newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
-   PerlIO_layer_hv = get_hv("perlio::layers",GV_ADD|GV_ADDMULTI);
-   PerlIO_layer_av = get_av("perlio::layers",GV_ADD|GV_ADDMULTI);
+   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);
@@ -370,13 +300,13 @@ PerlIO_default_layer(I32 n)
     {
      while (*s)
       {
-       while (*s && isspace((unsigned char)*s))
+       while (*s && isSPACE((unsigned char)*s))
         s++;
        if (*s)
         {
          char *e = s;
          SV *layer;
-         while (*e && !isspace((unsigned char)*e))
+         while (*e && !isSPACE((unsigned char)*e))
           e++;
          layer = PerlIO_find_layer(s,e-s);
          if (layer)
@@ -385,7 +315,7 @@ PerlIO_default_layer(I32 n)
            av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
           }
          else
-          Perl_warn(aTHX_ "Unknown layer %.*s",(e-s),s);
+          Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
          s = e;
         }
       }
@@ -430,6 +360,26 @@ PerlIO_stdstreams()
   }
 }
 
+PerlIO *
+PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
+{
+ PerlIOl *l = NULL;
+ Newc('L',l,tab->size,char,PerlIOl);
+ if (l)
+  {
+   Zero(l,tab->size,char);
+   l->next = *f;
+   l->tab  = tab;
+   *f      = l;
+   if ((*l->tab->Pushed)(f,mode) != 0)
+    {
+     PerlIO_pop(f);
+     return NULL;
+    }
+  }
+ return f;
+}
+
 #undef PerlIO_fdopen
 PerlIO *
 PerlIO_fdopen(int fd, const char *mode)
@@ -450,57 +400,6 @@ PerlIO_open(const char *path, const char *mode)
  return (*tab->Open)(tab,path,mode);
 }
 
-IV
-PerlIOBase_pushed(PerlIO *f, const char *mode)
-{
- PerlIOl *l = PerlIOBase(f);
- l->flags  &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
-                PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
- if (mode)
-  {
-   switch (*mode++)
-    {
-     case 'r':
-      l->flags = PERLIO_F_CANREAD;
-      break;
-     case 'a':
-      l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
-      break;
-     case 'w':
-      l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
-      break;
-     default:
-      errno = EINVAL;
-      return -1;
-    }
-   while (*mode)
-    {
-     switch (*mode++)
-      {
-       case '+':
-        l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
-        break;
-       case 'b':
-        l->flags |= PERLIO_F_BINARY;
-        break;
-      default:
-       errno = EINVAL;
-       return -1;
-      }
-    }
-  }
- else
-  {
-   if (l->next)
-    {
-     l->flags |= l->next->flags &
-                 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
-                   PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
-    }
-  }
- return 0;
-}
-
 #undef PerlIO_reopen
 PerlIO *
 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
@@ -721,24 +620,61 @@ PerlIOBase_fileno(PerlIO *f)
  return PerlIO_fileno(PerlIONext(f));
 }
 
-PerlIO *
-PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
+IV
+PerlIOBase_pushed(PerlIO *f, const char *mode)
 {
- PerlIOl *l = NULL;
- Newc('L',l,tab->size,char,PerlIOl);
- if (l)
+ PerlIOl *l = PerlIOBase(f);
+ l->flags  &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
+                PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
+ if (mode)
   {
-   Zero(l,tab->size,char);
-   l->next = *f;
-   l->tab  = tab;
-   *f      = l;
-   if ((*l->tab->Pushed)(f,mode) != 0)
+   switch (*mode++)
     {
-     PerlIO_pop(f);
-     return NULL;
+     case 'r':
+      l->flags = PERLIO_F_CANREAD;
+      break;
+     case 'a':
+      l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
+      break;
+     case 'w':
+      l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
+      break;
+     default:
+      errno = EINVAL;
+      return -1;
+    }
+   while (*mode)
+    {
+     switch (*mode++)
+      {
+       case '+':
+        l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
+        break;
+       case 'b':
+        l->flags |= PERLIO_F_BINARY;
+        break;
+      default:
+       errno = EINVAL;
+       return -1;
+      }
     }
   }
- return f;
+ else
+  {
+   if (l->next)
+    {
+     l->flags |= l->next->flags &
+                 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
+                   PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
+    }
+  }
+ return 0;
+}
+
+IV
+PerlIOBase_popped(PerlIO *f)
+{
+ return 0;
 }
 
 SSize_t
@@ -812,8 +748,6 @@ PerlIOBase_setlinebuf(PerlIO *f)
 
 }
 
-
-
 /*--------------------------------------------------------------------------------------*/
 /* Bottom-most level for UNIX-like case */
 
@@ -902,7 +836,7 @@ PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
  int oflags = PerlIOUnix_oflags(mode);
  if (oflags != -1)
   {
-   int fd = open(path,oflags,0666);
+   int fd = PerlLIO_open3(path,oflags,0666);
    if (fd >= 0)
     {
      PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
@@ -923,7 +857,7 @@ PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
   (*PerlIOBase(f)->tab->Close)(f);
  if (oflags != -1)
   {
-   int fd = open(path,oflags,0666);
+   int fd = PerlLIO_open3(path,oflags,0666);
    if (fd >= 0)
     {
      s->fd = fd;
@@ -943,7 +877,7 @@ PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
   return 0;
  while (1)
   {
-   SSize_t len = read(fd,vbuf,count);
+   SSize_t len = PerlLIO_read(fd,vbuf,count);
    if (len >= 0 || errno != EINTR)
     {
      if (len < 0)
@@ -961,7 +895,7 @@ PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
  int fd = PerlIOSelf(f,PerlIOUnix)->fd;
  while (1)
   {
-   SSize_t len = write(fd,vbuf,count);
+   SSize_t len = PerlLIO_write(fd,vbuf,count);
    if (len >= 0 || errno != EINTR)
     {
      if (len < 0)
@@ -974,7 +908,7 @@ PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
 IV
 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
 {
- Off_t new = lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
+ Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
  PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
  return (new == (Off_t) -1) ? -1 : 0;
 }
@@ -982,7 +916,7 @@ PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
 Off_t
 PerlIOUnix_tell(PerlIO *f)
 {
- return lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
+ return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
 }
 
 IV
@@ -990,7 +924,7 @@ PerlIOUnix_close(PerlIO *f)
 {
  int fd = PerlIOSelf(f,PerlIOUnix)->fd;
  int code = 0;
- while (close(fd) != 0)
+ while (PerlLIO_close(fd) != 0)
   {
    if (errno != EINTR)
     {
@@ -1021,8 +955,8 @@ PerlIO_funcs PerlIO_unix = {
  PerlIOUnix_seek,
  PerlIOUnix_tell,
  PerlIOUnix_close,
- PerlIOBase_noop_ok,
- PerlIOBase_noop_fail,
+ PerlIOBase_noop_ok,   /* flush */
+ PerlIOBase_noop_fail, /* fill */
  PerlIOBase_eof,
  PerlIOBase_error,
  PerlIOBase_clearerr,
@@ -1377,18 +1311,6 @@ PerlIO_releaseFILE(PerlIO *p, FILE *f)
 /*--------------------------------------------------------------------------------------*/
 /* perlio buffer layer */
 
-typedef struct
-{
- struct _PerlIO base;
- Off_t         posn;       /* Offset of buf into the file */
- STDCHAR *     buf;        /* Start of buffer */
- STDCHAR *     end;        /* End of valid part of buffer */
- STDCHAR *     ptr;        /* Current position in buffer */
- Size_t                bufsiz;     /* Size of buffer */
- IV            oneword;    /* Emergency buffer */
-} PerlIOBuf;
-
-
 PerlIO *
 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
 {
@@ -1421,15 +1343,24 @@ PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
  if (f)
   {
    PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
-   b->posn = 0;
+   b->posn = PerlIO_tell(PerlIONext(f));
   }
  return f;
 }
 
 int
-PerlIOBase_reopen(const char *path, const char *mode, PerlIO *f)
+PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
 {
- return (*PerlIOBase(f)->tab->Reopen)(path,mode,PerlIONext(f));
+ PerlIO *next = PerlIONext(f);
+ int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
+ if (code = 0)
+  code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
+ if (code == 0)
+  {
+   PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
+   b->posn = PerlIO_tell(PerlIONext(f));
+  }
+ return code;
 }
 
 /* This "flush" is akin to sfio's sync in that it handles files in either
@@ -1681,17 +1612,6 @@ PerlIOBuf_setlinebuf(PerlIO *f)
   }
 }
 
-void
-PerlIOBuf_set_cnt(PerlIO *f, int cnt)
-{
- PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
- dTHX;
- if (!b->buf)
-  PerlIO_get_base(f);
- b->ptr = b->end - cnt;
- assert(b->ptr >= b->buf);
-}
-
 STDCHAR *
 PerlIOBuf_get_ptr(PerlIO *f)
 {
@@ -1764,7 +1684,7 @@ PerlIO_funcs PerlIO_perlio = {
  PerlIOBase_fileno,
  PerlIOBuf_fdopen,
  PerlIOBuf_open,
- PerlIOBase_reopen,
+ PerlIOBuf_reopen,
  PerlIOBase_pushed,
  PerlIOBase_noop_ok,
  PerlIOBuf_read,
@@ -1793,13 +1713,18 @@ PerlIO_funcs PerlIO_perlio = {
 typedef struct
 {
  PerlIOBuf     base;         /* PerlIOBuf stuff */
+ Mmap_t                mptr;        /* Mapped address */
  Size_t                len;          /* mapped length */
  STDCHAR       *bbuf;        /* malloced buffer if map fails */
+
 } PerlIOMmap;
 
+static size_t page_size = 0;
+
 IV
 PerlIOMmap_map(PerlIO *f)
 {
+ dTHX;
  PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
  PerlIOBuf  *b = &m->base;
  IV flags = PerlIOBase(f)->flags;
@@ -1817,16 +1742,59 @@ PerlIOMmap_map(PerlIO *f)
      SSize_t len = st.st_size - b->posn;
      if (len > 0)
       {
-       b->buf = (STDCHAR *) mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, b->posn);
-       if (b->buf && b->buf != (STDCHAR *) -1)
+       Off_t posn;
+       if (!page_size) {
+#if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
+          {
+              SETERRNO(0,SS$_NORMAL);
+#   ifdef _SC_PAGESIZE
+              page_size = sysconf(_SC_PAGESIZE);
+#   else
+              page_size = sysconf(_SC_PAGE_SIZE);
+#   endif
+              if ((long)page_size < 0) {
+                  if (errno) {
+                      SV *error = ERRSV;
+                      char *msg;
+                      STRLEN n_a;
+                      (void)SvUPGRADE(error, SVt_PV);
+                      msg = SvPVx(error, n_a);
+                      Perl_croak(aTHX_ "panic: sysconf: %s", msg);
+                  }
+                  else
+                      Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
+              }
+          }
+#else
+#   ifdef HAS_GETPAGESIZE
+        page_size = getpagesize();
+#   else
+#       if defined(I_SYS_PARAM) && defined(PAGESIZE)
+        page_size = PAGESIZE; /* compiletime, bad */
+#       endif
+#   endif
+#endif
+       if ((IV)page_size <= 0)
+           Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
+       }
+       if (b->posn < 0)
+        {
+         /* This is a hack - should never happen - open should have set it ! */
+         b->posn = PerlIO_tell(PerlIONext(f));
+        }
+       posn = (b->posn / page_size) * page_size;
+       len  = st.st_size - posn;
+       m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
+       if (m->mptr && m->mptr != (Mmap_t) -1)
         {
 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
-         madvise((Mmap_t) b->buf, len, MADV_SEQUENTIAL);
+         madvise(m->mptr, len, MADV_SEQUENTIAL);
 #endif
-         PerlIOBase(f)->flags = flags | PERLIO_F_RDBUF;
-         b->end = b->buf+len;
-         b->ptr = b->buf;
-         m->len = len;
+         PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
+         b->end  = ((STDCHAR *)m->mptr) + len;
+         b->buf  = ((STDCHAR *)m->mptr) + (b->posn - posn);
+         b->ptr  = b->buf;
+         m->len  = len;
         }
        else
         {
@@ -1855,9 +1823,10 @@ PerlIOMmap_unmap(PerlIO *f)
   {
    if (b->buf)
     {
-     code = munmap((Mmap_t) b->buf, m->len);
-     b->buf = NULL;
-     m->len = 0;
+     code = munmap(m->mptr, m->len);
+     b->buf  = NULL;
+     m->len  = 0;
+     m->mptr = NULL;
      if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
       code = -1;
     }
@@ -1915,6 +1884,14 @@ PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
   {
    /* Loose the unwritable mapped buffer */
    PerlIO_flush(f);
+   /* If flush took the "buffer" see if we have one from before */
+   if (!b->buf && m->bbuf)
+    b->buf = m->bbuf;
+   if (!b->buf)
+    {
+     PerlIOBuf_get_base(f);
+     m->bbuf = b->buf;
+    }
   }
  return PerlIOBuf_unread(f,vbuf,count);
 }
@@ -2011,7 +1988,7 @@ PerlIO_funcs PerlIO_mmap = {
  PerlIOBase_fileno,
  PerlIOBuf_fdopen,
  PerlIOBuf_open,
- PerlIOBase_reopen,
+ PerlIOBuf_reopen,
  PerlIOBase_pushed,
  PerlIOBase_noop_ok,
  PerlIOBuf_read,
@@ -2035,8 +2012,6 @@ PerlIO_funcs PerlIO_mmap = {
 
 #endif /* HAS_MMAP */
 
-
-
 void
 PerlIO_init(void)
 {
@@ -2193,7 +2168,7 @@ PerlIO_tmpfile(void)
     {
      PerlIOBase(f)->flags |= PERLIO_F_TEMP;
     }
-   unlink(SvPVX(sv));
+   PerlLIO_unlink(SvPVX(sv));
    SvREFCNT_dec(sv);
   }
  return f;
@@ -2238,7 +2213,7 @@ int
 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
 {
  *pos = PerlIO_tell(f);
- return 0;
+ return *pos == -1 ? -1 : 0;
 }
 #else
 #ifndef PERLIO_IS_STDIO
@@ -2283,7 +2258,8 @@ PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
    if (strlen(s) >= (STRLEN)n)
     {
      dTHX;
-     PerlIO_puts(Perl_error_log,"panic: sprintf overflow - memory corrupted!\n");
+     (void)PerlIO_puts(Perl_error_log,
+                      "panic: sprintf overflow - memory corrupted!\n");
      my_exit(1);
     }
   }