summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorTim Bunce <Tim.Bunce@pobox.com>1997-10-15 15:55:26 +0000
committerTim Bunce <Tim.Bunce@pobox.com>1997-10-15 15:55:26 +0000
commit50e27ac33704d6fb34d4be7cfb426b2097b27505 (patch)
tree0b92fcafbf7277d6096b994621b87c50f7988ff8 /mg.c
parent2269e8ecc334a5a77bdb915666547431c0171402 (diff)
parentfb73857aa0bfa8ed43d4d2f972c564c70a57e0c4 (diff)
downloadperl-50e27ac33704d6fb34d4be7cfb426b2097b27505.tar.gz
Maintenance 5.004_04 changes
p4raw-id: //depot/maint-5.004/perl@128
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/mg.c b/mg.c
index 7c7ea2a97d..ee87d47859 100644
--- a/mg.c
+++ b/mg.c
@@ -357,8 +357,15 @@ MAGIC *mg;
}
#else
#ifdef OS2
- sv_setnv(sv, (double)Perl_rc);
- sv_setpv(sv, os2error(Perl_rc));
+ if (!(_emx_env & 0x200)) { /* Under DOS */
+ sv_setnv(sv, (double)errno);
+ sv_setpv(sv, errno ? Strerror(errno) : "");
+ } else {
+ if (errno != errno_isOS2)
+ Perl_rc = _syserrno();
+ sv_setnv(sv, (double)Perl_rc);
+ sv_setpv(sv, os2error(Perl_rc));
+ }
#else
sv_setnv(sv, (double)errno);
sv_setpv(sv, errno ? Strerror(errno) : "");
@@ -384,6 +391,14 @@ MAGIC *mg;
case '\020': /* ^P */
sv_setiv(sv, (IV)perldb);
break;
+ case '\023': /* ^S */
+ if (lex_state != LEX_NOTPARSING)
+ SvOK_off(sv);
+ else if (in_eval)
+ sv_setiv(sv, 1);
+ else
+ sv_setiv(sv, 0);
+ break;
case '\024': /* ^T */
#ifdef BIG_TIME
sv_setnv(sv, basetime);
@@ -654,6 +669,28 @@ MAGIC* mg;
}
int
+magic_set_all_env(sv,mg)
+SV* sv;
+MAGIC* mg;
+{
+#if defined(VMS)
+ die("Can't make list assignment to %%ENV on this system");
+#else
+ if (localizing) {
+ HE* entry;
+ magic_clear_all_env(sv,mg);
+ hv_iterinit((HV*)sv);
+ while (entry = hv_iternext((HV*)sv)) {
+ I32 keylen;
+ my_setenv(hv_iterkey(entry, &keylen),
+ SvPV(hv_iterval((HV*)sv, entry), na));
+ }
+ }
+#endif
+ return 0;
+}
+
+int
magic_clear_all_env(sv,mg)
SV* sv;
MAGIC* mg;
@@ -1601,16 +1638,28 @@ MAGIC* mg;
s += strlen(s);
/* See if all the arguments are contiguous in memory */
for (i = 1; i < origargc; i++) {
- if (origargv[i] == s + 1)
+ if (origargv[i] == s + 1
+#ifdef OS2
+ || origargv[i] == s + 2
+#endif
+ )
s += strlen(++s); /* this one is ok too */
+ else
+ break;
}
/* can grab env area too? */
- if (origenviron && origenviron[0] == s + 1) {
+ if (origenviron && (origenviron[0] == s + 1
+#ifdef OS2
+ || (origenviron[0] == s + 9 && (s += 8))
+#endif
+ )) {
my_setenv("NoNe SuCh", Nullch);
/* force copy of environment */
for (i = 0; origenviron[i]; i++)
if (origenviron[i] == s + 1)
s += strlen(++s);
+ else
+ break;
}
origalen = s - origargv[0];
}
@@ -1618,9 +1667,11 @@ MAGIC* mg;
i = len;
if (i >= origalen) {
i = origalen;
- SvCUR_set(sv, i);
- *SvEND(sv) = '\0';
+ /* don't allow system to limit $0 seen by script */
+ /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
Copy(s, origargv[0], i, char);
+ s = origargv[0]+i;
+ *s = '\0';
}
else {
Copy(s, origargv[0], i, char);