Quickier thread-specific data on OS/2
[p5sagit/p5-mst-13.2.git] / util.c
diff --git a/util.c b/util.c
index 0890027..688314c 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1,6 +1,6 @@
 /*    util.c
  *
- *    Copyright (c) 1991-1997, Larry Wall
+ *    Copyright (c) 1991-1999, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -1213,7 +1213,7 @@ form(const char* pat, ...)
     return SvPVX(sv);
 }
 
-char *
+SV *
 mess(const char *pat, va_list *args)
 {
     SV *sv = mess_alloc();
@@ -1222,24 +1222,20 @@ mess(const char *pat, va_list *args)
     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
     if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
        dTHR;
-       if (PL_dirty)
-           sv_catpv(sv, dgd);
-       else {
-           if (PL_curcop->cop_line)
-               sv_catpvf(sv, " at %_ line %ld",
-                         GvSV(PL_curcop->cop_filegv), (long)PL_curcop->cop_line);
-           if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
-               bool line_mode = (RsSIMPLE(PL_rs) &&
-                                 SvLEN(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
-               sv_catpvf(sv, ", <%s> %s %ld",
-                         PL_last_in_gv == PL_argvgv ? "" : GvNAME(PL_last_in_gv),
-                         line_mode ? "line" : "chunk", 
-                         (long)IoLINES(GvIOp(PL_last_in_gv)));
-           }
-           sv_catpv(sv, ".\n");
+       if (PL_curcop->cop_line)
+           sv_catpvf(sv, " at %_ line %ld",
+                     GvSV(PL_curcop->cop_filegv), (long)PL_curcop->cop_line);
+       if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
+           bool line_mode = (RsSIMPLE(PL_rs) &&
+                             SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
+           sv_catpvf(sv, ", <%s> %s %ld",
+                     PL_last_in_gv == PL_argvgv ? "" : GvNAME(PL_last_in_gv),
+                     line_mode ? "line" : "chunk", 
+                     (long)IoLINES(GvIOp(PL_last_in_gv)));
        }
+       sv_catpv(sv, PL_dirty ? dgd : ".\n");
     }
-    return SvPVX(sv);
+    return sv;
 }
 
 OP *
@@ -1252,13 +1248,21 @@ die(const char* pat, ...)
     HV *stash;
     GV *gv;
     CV *cv;
+    SV *msv;
+    STRLEN msglen;
 
     DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                          "%p: die: curstack = %p, mainstack = %p\n",
                          thr, PL_curstack, PL_mainstack));
 
     va_start(args, pat);
-    message = pat ? mess(pat, &args) : Nullch;
+    if (pat) {
+       msv = mess(pat, &args);
+       message = SvPV(msv,msglen);
+    }
+    else {
+       message = Nullch;
+    }
     va_end(args);
 
     DEBUG_S(PerlIO_printf(PerlIO_stderr(),
@@ -1277,8 +1281,8 @@ die(const char* pat, ...)
            SV *msg;
 
            ENTER;
-           if(message) {
-               msg = newSVpv(message, 0);
+           if (message) {
+               msg = newSVpvn(message, msglen);
                SvREADONLY_on(msg);
                SAVEFREESV(msg);
            }
@@ -1296,7 +1300,7 @@ die(const char* pat, ...)
        }
     }
 
-    PL_restartop = die_where(message);
+    PL_restartop = die_where(message, msglen);
     DEBUG_S(PerlIO_printf(PerlIO_stderr(),
          "%p: die: restartop = %p, was_in_eval = %d, top_env = %p\n",
          thr, PL_restartop, was_in_eval, PL_top_env));
@@ -1314,9 +1318,12 @@ croak(const char* pat, ...)
     HV *stash;
     GV *gv;
     CV *cv;
+    SV *msv;
+    STRLEN msglen;
 
     va_start(args, pat);
-    message = mess(pat, &args);
+    msv = mess(pat, &args);
+    message = SvPV(msv,msglen);
     va_end(args);
     DEBUG_S(PerlIO_printf(PerlIO_stderr(), "croak: 0x%lx %s", (unsigned long) thr, message));
     if (PL_diehook) {
@@ -1332,7 +1339,7 @@ croak(const char* pat, ...)
            SV *msg;
 
            ENTER;
-           msg = newSVpv(message, 0);
+           msg = newSVpvn(message, msglen);
            SvREADONLY_on(msg);
            SAVEFREESV(msg);
 
@@ -1346,11 +1353,20 @@ croak(const char* pat, ...)
        }
     }
     if (PL_in_eval) {
-       PL_restartop = die_where(message);
+       PL_restartop = die_where(message, msglen);
        JMPENV_JUMP(3);
     }
-    PerlIO_puts(PerlIO_stderr(),message);
-    (void)PerlIO_flush(PerlIO_stderr());
+    {
+#ifdef USE_SFIO
+       /* SFIO can really mess with your errno */
+       int e = errno;
+#endif
+       PerlIO_write(PerlIO_stderr(), message, msglen);
+       (void)PerlIO_flush(PerlIO_stderr());
+#ifdef USE_SFIO
+       errno = e;
+#endif
+    }
     my_failure_exit();
 }
 
@@ -1362,9 +1378,12 @@ warn(const char* pat,...)
     HV *stash;
     GV *gv;
     CV *cv;
+    SV *msv;
+    STRLEN msglen;
 
     va_start(args, pat);
-    message = mess(pat, &args);
+    msv = mess(pat, &args);
+    message = SvPV(msv, msglen);
     va_end(args);
 
     if (PL_warnhook) {
@@ -1381,7 +1400,7 @@ warn(const char* pat,...)
            SV *msg;
 
            ENTER;
-           msg = newSVpv(message, 0);
+           msg = newSVpvn(message, msglen);
            SvREADONLY_on(msg);
            SAVEFREESV(msg);
 
@@ -1395,7 +1414,7 @@ warn(const char* pat,...)
            return;
        }
     }
-    PerlIO_puts(PerlIO_stderr(),message);
+    PerlIO_write(PerlIO_stderr(), message, msglen);
 #ifdef LEAKTEST
     DEBUG_L(*message == '!' 
            ? (xstat(message[1]=='!'
@@ -1416,9 +1435,12 @@ warner(U32  err, const char* pat,...)
     HV *stash;
     GV *gv;
     CV *cv;
+    SV *msv;
+    STRLEN msglen;
 
     va_start(args, pat);
-    message = mess(pat, &args);
+    msv = mess(pat, &args);
+    message = SvPV(msv, msglen);
     va_end(args);
 
     if (ckDEAD(err)) {
@@ -1438,7 +1460,7 @@ warner(U32  err, const char* pat,...)
                 SV *msg;
  
                 ENTER;
-                msg = newSVpv(message, 0);
+                msg = newSVpvn(message, msglen);
                 SvREADONLY_on(msg);
                 SAVEFREESV(msg);
  
@@ -1451,10 +1473,10 @@ warner(U32  err, const char* pat,...)
             }
         }
         if (PL_in_eval) {
-            PL_restartop = die_where(message);
+            PL_restartop = die_where(message, msglen);
             JMPENV_JUMP(3);
         }
-        PerlIO_puts(PerlIO_stderr(),message);
+        PerlIO_write(PerlIO_stderr(), message, msglen);
         (void)PerlIO_flush(PerlIO_stderr());
         my_failure_exit();
 
@@ -1474,7 +1496,7 @@ warner(U32  err, const char* pat,...)
                 SV *msg;
  
                 ENTER;
-                msg = newSVpv(message, 0);
+                msg = newSVpvn(message, msglen);
                 SvREADONLY_on(msg);
                 SAVEFREESV(msg);
  
@@ -1487,7 +1509,7 @@ warner(U32  err, const char* pat,...)
                 return;
             }
         }
-        PerlIO_puts(PerlIO_stderr(),message);
+        PerlIO_write(PerlIO_stderr(), message, msglen);
 #ifdef LEAKTEST
         DEBUG_L(xstat());
 #endif
@@ -1889,6 +1911,7 @@ my_popen(char *cmd, char *mode)
     SV *sv;
     I32 doexec = strNE(cmd,"-");
 
+    PERL_FLUSHALL_FOR_CHILD;
 #ifdef OS2
     if (doexec) {
        return my_syspopen(cmd,mode);
@@ -1962,12 +1985,11 @@ my_popen(char *cmd, char *mode)
 #if defined(atarist) || defined(DJGPP)
 FILE *popen();
 PerlIO *
-my_popen(cmd,mode)
-char   *cmd;
-char   *mode;
+my_popen(char *cmd, char *mode)
 {
     /* Needs work for PerlIO ! */
     /* used 0 for 2nd parameter to PerlIO-exportFILE; apparently not used */
+    PERL_FLUSHALL_FOR_CHILD;
     return popen(PerlIO_exportFILE(cmd, 0), mode);
 }
 #endif
@@ -2187,7 +2209,7 @@ my_pclose(PerlIO *ptr)
 }
 #endif /* !DOSISH */
 
-#if  !defined(DOSISH) || defined(OS2) || defined(WIN32)
+#if  !defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(CYGWIN32)
 I32
 wait4pid(int pid, int *statusp, int flags)
 {
@@ -2418,10 +2440,10 @@ scan_bin(char *start, I32 len, I32 *retlen)
       retval = n | (*s++ - '0');
       len--;
     }
-    if (len && (*s >= '2' || *s <= '9')) {
+    if (len && (*s >= '2' && *s <= '9')) {
       dTHR;
       if (ckWARN(WARN_UNSAFE))
-          warner(WARN_UNSAFE, "Illegal binary digit ignored");
+          warner(WARN_UNSAFE, "Illegal binary digit '%c' ignored", *s);
     }
     *retlen = s - start;
     return retval;
@@ -2445,7 +2467,7 @@ scan_oct(char *start, I32 len, I32 *retlen)
     if (len && (*s == '8' || *s == '9')) {
        dTHR;
        if (ckWARN(WARN_OCTAL))
-           warner(WARN_OCTAL, "Illegal octal digit ignored");
+           warner(WARN_OCTAL, "Illegal octal digit '%c' ignored", *s);
     }
     *retlen = s - start;
     return retval;
@@ -2469,7 +2491,7 @@ scan_hex(char *start, I32 len, I32 *retlen)
                dTHR;
                --s;
                if (ckWARN(WARN_UNSAFE))
-                   warner(WARN_UNSAFE,"Illegal hex digit ignored");
+                   warner(WARN_UNSAFE,"Illegal hex digit '%c' ignored", *s);
                break;
            }
        }
@@ -2802,11 +2824,11 @@ condpair_magic(SV *sv)
        COND_INIT(&cp->owner_cond);
        COND_INIT(&cp->cond);
        cp->owner = 0;
-       LOCK_SV_MUTEX;
+       MUTEX_LOCK(&PL_cred_mutex);             /* XXX need separate mutex? */
        mg = mg_find(sv, 'm');
        if (mg) {
            /* someone else beat us to initialising it */
-           UNLOCK_SV_MUTEX;
+           MUTEX_UNLOCK(&PL_cred_mutex);       /* XXX need separate mutex? */
            MUTEX_DESTROY(&cp->mutex);
            COND_DESTROY(&cp->owner_cond);
            COND_DESTROY(&cp->cond);
@@ -2817,7 +2839,7 @@ condpair_magic(SV *sv)
            mg = SvMAGIC(sv);
            mg->mg_ptr = (char *)cp;
            mg->mg_len = sizeof(cp);
-           UNLOCK_SV_MUTEX;
+           MUTEX_UNLOCK(&PL_cred_mutex);       /* XXX need separate mutex? */
            DEBUG_S(WITH_THR(PerlIO_printf(PerlIO_stderr(),
                                           "%p: condpair_magic %p\n", thr, sv));)
        }
@@ -2840,7 +2862,7 @@ new_struct_thread(struct perl_thread *t)
     SV **svp;
     I32 i;
 
-    sv = newSVpv("", 0);
+    sv = newSVpvn("", 0);
     SvGROW(sv, sizeof(struct perl_thread) + 1);
     SvCUR_set(sv, sizeof(struct perl_thread));
     thr = (Thread) SvPVX(sv);
@@ -2864,7 +2886,7 @@ new_struct_thread(struct perl_thread *t)
     thr->cvcache = newHV();
     thr->threadsv = newAV();
     thr->specific = newAV();
-    thr->errsv = newSVpv("", 0);
+    thr->errsv = newSVpvn("", 0);
     thr->errhv = newHV();
     thr->flags = THRf_R_JOINABLE;
     MUTEX_INIT(&thr->mutex);
@@ -3000,6 +3022,21 @@ get_specialsv_list(void)
  return PL_specialsv_list;
 }
 
+#ifndef HAS_GETENV_SV
+SV *
+getenv_sv(char *env_elem)
+{
+  char *env_trans;
+  SV *temp_sv;
+  if ((env_trans = PerlEnv_getenv(env_elem)) != Nullch) {
+    temp_sv = newSVpv(env_trans, strlen(env_trans));
+    return temp_sv;
+  } else {
+    return &PL_sv_undef;
+  }
+}
+#endif
+
 
 MGVTBL*
 get_vtbl(int vtbl_id)