EBCDIC: the non-printable characters are different.
[p5sagit/p5-mst-13.2.git] / util.c
diff --git a/util.c b/util.c
index 1d2048b..33dcf19 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1,6 +1,6 @@
 /*    util.c
  *
- *    Copyright (c) 1991-2001, Larry Wall
+ *    Copyright (c) 1991-2002, 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.
@@ -488,6 +488,8 @@ Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *lit
    If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
 
 /*
+=head1 Miscellaneous Functions
+
 =for apidoc fbm_compile
 
 Analyses the string in order to make fast searches on it using fbm_instr()
@@ -877,6 +879,8 @@ Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len)
 /* copy a string to a safe spot */
 
 /*
+=head1 Memory Management
+
 =for apidoc savepv
 
 Copy a string to a safe spot.  This does not use an SV.
@@ -887,10 +891,11 @@ Copy a string to a safe spot.  This does not use an SV.
 char *
 Perl_savepv(pTHX_ const char *sv)
 {
-    register char *newaddr;
-
-    New(902,newaddr,strlen(sv)+1,char);
-    (void)strcpy(newaddr,sv);
+    register char *newaddr = Nullch;
+    if (sv) {
+       New(902,newaddr,strlen(sv)+1,char);
+       (void)strcpy(newaddr,sv);
+    }
     return newaddr;
 }
 
@@ -900,7 +905,8 @@ Perl_savepv(pTHX_ const char *sv)
 =for apidoc savepvn
 
 Copy a string to a safe spot.  The C<len> indicates number of bytes to
-copy.  This does not use an SV.
+copy. If pointer is NULL allocate space for a string of size specified.
+This does not use an SV.
 
 =cut
 */
@@ -911,11 +917,38 @@ Perl_savepvn(pTHX_ const char *sv, register I32 len)
     register char *newaddr;
 
     New(903,newaddr,len+1,char);
-    Copy(sv,newaddr,len,char);         /* might not be null terminated */
-    newaddr[len] = '\0';               /* is now */
+    /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
+    if (sv) {
+       Copy(sv,newaddr,len,char);      /* might not be null terminated */
+       newaddr[len] = '\0';            /* is now */
+    }
+    else {
+       Zero(newaddr,len+1,char);
+    }
     return newaddr;
 }
 
+/*
+=for apidoc savesharedpv
+
+Copy a string to a safe spot in memory shared between threads.
+This does not use an SV.
+
+=cut
+*/
+char *
+Perl_savesharedpv(pTHX_ const char *sv)
+{
+    register char *newaddr = Nullch;
+    if (sv) {
+       newaddr = PerlMemShared_malloc(strlen(sv)+1);
+       (void)strcpy(newaddr,sv);
+    }
+    return newaddr;
+}
+
+
+
 /* the SV for Perl_form() and mess() is not kept in an arena */
 
 STATIC SV *
@@ -955,6 +988,7 @@ Perl_form_nocontext(const char* pat, ...)
 #endif /* PERL_IMPLICIT_CONTEXT */
 
 /*
+=head1 Miscellaneous Functions
 =for apidoc form
 
 Takes a sprintf-style format pattern and conventional
@@ -1070,7 +1104,7 @@ Perl_vmess(pTHX_ const char *pat, va_list *args)
 
        if (CopLINE(cop))
            Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
-                          CopFILE(cop), (IV)CopLINE(cop));
+           OutCopFILE(cop), (IV)CopLINE(cop));
        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');
@@ -1285,6 +1319,8 @@ Perl_croak_nocontext(const char *pat, ...)
 #endif /* PERL_IMPLICIT_CONTEXT */
 
 /*
+=head1 Warning and Dieing
+
 =for apidoc croak
 
 This is the XSUB-writer's interface to Perl's C<die> function.
@@ -3759,6 +3795,8 @@ return FALSE
         (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
 
 /*
+=head1 Miscellaneous Functions
+
 =for apidoc getcwd_sv
 
 Fill the sv with current working directory
@@ -3921,6 +3959,8 @@ Perl_getcwd_sv(pTHX_ register SV *sv)
 }
 
 /*
+=head1 SV Manipulation Functions
+
 =for apidoc new_vstring
 
 Returns a pointer to the next character after the parsed
@@ -3992,7 +4032,11 @@ Perl_new_vstring(pTHX_ char *s, SV *sv)
     return s;
 }
 
-#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET)
+#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM)
+#   define EMULATE_SOCKETPAIR_UDP
+#endif
+
+#ifdef EMULATE_SOCKETPAIR_UDP
 static int
 S_socketpair_udp (int fd[2]) {
     dTHX;
@@ -4158,8 +4202,10 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
         return -1;
     }
 
+#ifdef EMULATE_SOCKETPAIR_UDP
     if (type == SOCK_DGRAM)
         return S_socketpair_udp (fd);
+#endif
 
     listener = PerlSock_socket (AF_INET, type, 0);
     if (listener == -1)
@@ -4224,3 +4270,61 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
     }
 }
 #endif /* !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) */
+#ifdef HAS_SOCKETPAIR
+/* In any case have a stub so that there's code corresponding
+ * to the my_socketpair in global.sym. */
+int
+Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
+    return socketpair(family, type, protocol, fd);
+}
+#endif
+
+/*
+
+=for apidoc sv_nosharing
+
+Dummy routine which "shares" an SV when there is no sharing module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+=cut
+*/
+
+void
+Perl_sv_nosharing(pTHX_ SV *sv)
+{
+}
+
+/*
+=for apidoc sv_nolocking
+
+Dummy routine which "locks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+=cut
+*/
+
+void
+Perl_sv_nolocking(pTHX_ SV *sv)
+{
+}
+
+
+/*
+=for apidoc sv_nounlocking
+
+Dummy routine which "unlocks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+=cut
+*/
+
+void
+Perl_sv_nounlocking(pTHX_ SV *sv)
+{
+}
+
+
+