This is a live mirror of the Perl 5 development currently hosted at
x2p/str.c C++ clean-up.
authorCraig A. Berry <>
Sun, 15 Jul 2012 21:18:42 +0000 (16:18 -0500)
committerCraig A. Berry <>
Tue, 31 Jul 2012 23:42:41 +0000 (18:42 -0500)
Compiling str.c with HP C++ for OpenVMS says,

        FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */
%CXX-E-INCASSOPN, a value of type "void *" cannot be assigned to an
          entity of type "char *"
at line number 213 in file D0:[craig.blead.x2p]str.c;1

    FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */
%CXX-E-INCASSOPN, a value of type "void *" cannot be assigned to an
          entity of type "char *"
at line number 233 in file D0:[craig.blead.x2p]str.c;1

So remove the void casts to avoid the errors.  This is an exact
mirror of d06fc7d4ca98, which also removed the void cast from an
equivalent line in perlio.c.  That was almost six years ago, so if
anything especially dire were going to happen without the cast, it
likely would have happened by now.

The casts were added by cc00df79d5 and 5faea5d5, the former of which
refers vaguely to "compiler worries" without specifying what they
were, but signedness warnings are a likely suspect.  We'll get those
again now, but warnings are less bad than errors.  A more robust
solution would be to add a Configure-time detection of the type of
FILE._ptr and cast everything to that.

An even more robust solution would be to eliminate all the "buffer
snooping" mechanisms and concede that maintaining an stdio
implementation is a job for stdio maintainers and not Perl


index 58798c0..d54d088 100644 (file)
--- a/x2p/str.c
+++ b/x2p/str.c
@@ -210,7 +210,7 @@ str_gets(register STR *str, register FILE *fp)
        FILE_cnt(fp) = cnt;             /* deregisterize cnt and ptr */
-       FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */
+       FILE_ptr(fp) = ptr;
        i = getc(fp);           /* get more characters */
        cnt = FILE_cnt(fp);
        ptr = (STDCHAR*)FILE_ptr(fp);           /* reregisterize cnt and ptr */
@@ -230,7 +230,7 @@ str_gets(register STR *str, register FILE *fp)
     FILE_cnt(fp) = cnt;                        /* put these back or we're in trouble */
-    FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */
+    FILE_ptr(fp) = ptr;
     *bp = '\0';
     str->str_cur = bp - str->str_ptr;  /* set length */