z/OS: changes for building threaded from "Brian De Pradine"
[p5sagit/p5-mst-13.2.git] / util.c
diff --git a/util.c b/util.c
index e980707..ab1d6dc 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1,6 +1,7 @@
 /*    util.c
  *
- *    Copyright (c) 1991-2002, Larry Wall
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -357,8 +358,12 @@ Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
     I32 rarest = 0;
     U32 frequency = 256;
 
-    if (flags & FBMcf_TAIL)
+    if (flags & FBMcf_TAIL) {
+       MAGIC *mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
        sv_catpvn(sv, "\n", 1);         /* Taken into account in fbm_instr() */
+       if (mg && mg->mg_len >= 0)
+           mg->mg_len++;
+    }
     s = (U8*)SvPV_force(sv, len);
     (void)SvUPGRADE(sv, SVt_PVBM);
     if (len == 0)              /* TAIL might be on a zero-length string. */
@@ -1242,7 +1247,7 @@ Perl_vwarn(pTHX_ const char* pat, va_list *args)
     }
 
     /* if STDERR is tied, use it instead */
-    if (PL_stderrgv && (io = GvIOp(PL_stderrgv))
+    if (PL_stderrgv && SvREFCNT(PL_stderrgv) && (io = GvIO(PL_stderrgv))
        && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
        dSP; ENTER;
        PUSHMARK(SP);
@@ -3678,7 +3683,7 @@ Perl_scan_vstring(pTHX_ char *s, SV *sv)
            }
 #ifdef EBCDIC
            if (rev > 0x7FFFFFFF)
-                Perl_croak(aTHX "In EBCDIC the v-string components cannot exceed 2147483647");
+                Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
 #endif
            /* Append native character for the rev point */
            tmpend = uvchr_to_utf8(tmpbuf, rev);
@@ -3778,7 +3783,7 @@ Perl_scan_version(pTHX_ char *s, SV *rv)
                        orev = rev;
                        rev += (*s - '0') * mult;
                        mult /= 10;
-                       if ( abs(orev) > abs(rev) )
+                       if ( PERL_ABS(orev) > PERL_ABS(rev) )
                            Perl_croak(aTHX_ "Integer overflow in version");
                        s++;
                    }
@@ -3788,7 +3793,7 @@ Perl_scan_version(pTHX_ char *s, SV *rv)
                        orev = rev;
                        rev += (*end - '0') * mult;
                        mult *= 10;
-                       if ( abs(orev) > abs(rev) )
+                       if ( PERL_ABS(orev) > PERL_ABS(rev) )
                            Perl_croak(aTHX_ "Integer overflow in version");
                    }
                } 
@@ -3907,11 +3912,11 @@ Perl_vnumify(pTHX_ SV *vs)
        return sv;
     }
     digit = SvIVX(*av_fetch((AV *)vs, 0, 0));
-    Perl_sv_setpvf(aTHX_ sv,"%d.",abs(digit));
+    Perl_sv_setpvf(aTHX_ sv,"%d.", PERL_ABS(digit));
     for ( i = 1 ; i <= len ; i++ )
     {
        digit = SvIVX(*av_fetch((AV *)vs, i, 0));
-       Perl_sv_catpvf(aTHX_ sv,"%03d",abs(digit));
+       Perl_sv_catpvf(aTHX_ sv,"%03d", PERL_ABS(digit));
     }
     if ( len == 0 )
         Perl_sv_catpv(aTHX_ sv,"000");
@@ -3989,8 +3994,8 @@ Perl_vcmp(pTHX_ SV *lsv, SV *rsv)
        I32 right = SvIV(*av_fetch((AV *)rsv,i,0));
        bool lbeta = left  < 0 ? 1 : 0;
        bool rbeta = right < 0 ? 1 : 0;
-       left  = abs(left);
-       right = abs(right);
+       left  = PERL_ABS(left);
+       right = PERL_ABS(right);
        if ( left < right || (left == right && lbeta && !rbeta) )
            retval = -1;
        if ( left > right || (left == right && rbeta && !lbeta) )
@@ -4320,7 +4325,7 @@ Perl_parse_unicode_opts(pTHX_ char **popt)
        if (isDIGIT(*p)) {
            opt = (U32) atoi(p);
            while (isDIGIT(*p)) p++;
-           if (*p)
+           if (*p && *p != '\n' && *p != '\r')
                 Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
        }
        else {
@@ -4345,8 +4350,9 @@ Perl_parse_unicode_opts(pTHX_ char **popt)
                 case PERL_UNICODE_ARGV:
                      opt |= PERL_UNICODE_ARGV_FLAG;    break;
                 default:
-                     Perl_croak(aTHX_
-                                "Unknown Unicode option letter '%c'", *p);
+                     if (*p != '\n' && *p != '\r')
+                         Perl_croak(aTHX_
+                                    "Unknown Unicode option letter '%c'", *p);
                 }
            }
        }