/* 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.
return SvPVX(sv);
}
-char *
+SV *
mess(const char *pat, va_list *args)
{
SV *sv = mess_alloc();
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 *
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(),
SV *msg;
ENTER;
- if(message) {
- msg = newSVpv(message, 0);
+ if (message) {
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
}
}
}
- 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));
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) {
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
}
}
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();
}
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) {
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
return;
}
}
- PerlIO_puts(PerlIO_stderr(),message);
+ PerlIO_write(PerlIO_stderr(), message, msglen);
#ifdef LEAKTEST
DEBUG_L(*message == '!'
? (xstat(message[1]=='!'
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)) {
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
}
}
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();
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
return;
}
}
- PerlIO_puts(PerlIO_stderr(),message);
+ PerlIO_write(PerlIO_stderr(), message, msglen);
#ifdef LEAKTEST
DEBUG_L(xstat());
#endif
SV *sv;
I32 doexec = strNE(cmd,"-");
+ PERL_FLUSHALL_FOR_CHILD;
#ifdef OS2
if (doexec) {
return my_syspopen(cmd,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
}
#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)
{
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;
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;
dTHR;
--s;
if (ckWARN(WARN_UNSAFE))
- warner(WARN_UNSAFE,"Illegal hex digit ignored");
+ warner(WARN_UNSAFE,"Illegal hex digit '%c' ignored", *s);
break;
}
}
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);
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));)
}
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);
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);
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)