summaryrefslogtreecommitdiff
path: root/vms
diff options
context:
space:
mode:
authorCraig A. Berry <craigberry@mac.com>2000-09-16 05:11:10 -0500
committerNick Ing-Simmons <nik@tiuk.ti.com>2000-09-30 12:51:41 +0000
commit1a00323576160bade44aab52a55dcea124ae0c01 (patch)
tree6a2ad3c83401187e54674b226ab9d675e0beb262 /vms
parent5fa9e1699857f48f424aaf1b7c26bcdffdf16a76 (diff)
downloadperl-1a00323576160bade44aab52a55dcea124ae0c01.tar.gz
another VMS my_fwrite() fix for Storable
Message-Id: <4.3.2.7.2.20000916010548.01ce1b60@exchi01> p4raw-id: //depot/perl@7101
Diffstat (limited to 'vms')
-rw-r--r--vms/vms.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/vms/vms.c b/vms/vms.c
index d9ea5fa26b..d7a2dcd5af 100644
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -4695,24 +4695,37 @@ do_spawn(char *cmd)
/*
* A simple fwrite replacement which outputs itmsz*nitm chars without
* introducing record boundaries every itmsz chars.
+ * We are using fputs, which depends on a terminating null. We may
+ * well be writing binary data, so we need to accommodate not only
+ * data with nulls sprinkled in the middle but also data with no null
+ * byte at the end.
*/
/*{{{ int my_fwrite(void *src, size_t itmsz, size_t nitm, FILE *dest)*/
int
my_fwrite(void *src, size_t itmsz, size_t nitm, FILE *dest)
{
- register char *cp, *end;
+ register char *cp, *end, *cpd, *data;
+ int retval;
+ int bufsize = itmsz*nitm+1;
- end = (char *)src + itmsz * nitm;
+ _ckvmssts_noperl(lib$get_vm( &bufsize, &data ));
+ memcpy( data, src, itmsz*nitm );
+ data[itmsz*nitm] = '\0';
- while ((char *)src <= end) {
- for (cp = src; cp <= end; cp++) if (!*cp) break;
- if (fputs(src,dest) == EOF) return EOF;
+ end = data + itmsz * nitm;
+ retval = (int) nitm; /* on success return # items written */
+
+ cpd = data;
+ while (cpd <= end) {
+ for (cp = cpd; cp <= end; cp++) if (!*cp) break;
+ if (fputs(cpd,dest) == EOF) { retval = EOF; break; }
if (cp < end)
- if (fputc('\0',dest) == EOF) return EOF;
- src = cp + 1;
+ if (fputc('\0',dest) == EOF) { retval = EOF; break; }
+ cpd = cp + 1;
}
- return nitm;
+ if (data) _ckvmssts_noperl(lib$free_vm( &bufsize, &data ));
+ return retval;
} /* end of my_fwrite() */
/*}}}*/