-/* PDPC code - unreviewed, verbatim.
-Read the note in fopen.c.
-#ifndef __MVS__
-size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
-{
- size_t towrite;
- size_t elemWritten;
-#ifdef __OS2__
- ULONG actualWritten;
- APIRET rc;
-#endif
-#ifdef __MSDOS__
- size_t actualWritten;
- int errind;
-#endif
-
- if (nmemb == 1)
- {
- towrite = size;
- }
- else if (size == 1)
- {
- towrite = nmemb;
- }
- else
- {
- towrite = size * nmemb;
- }
- if (towrite < stream->szfbuf)
- {
- stream->quickBin = 0;
- if ((stream->bufTech == _IONBF) && !stream->textMode)
- {
- stream->quickBin = 1;
- }
- }
- if (!stream->quickBin)
- {
- fwriteSlow(ptr, size, nmemb, stream, towrite, &elemWritten);
- return (elemWritten);
- }
- else
- {
-#ifdef __OS2__
- rc = DosWrite(stream->hfile, (VOID *)ptr, towrite, &actualWritten);
- if (rc != 0)
- {
- stream->errorInd = 1;
- actualWritten = 0;
- errno = rc;
- }
-#endif
-#ifdef __MSDOS__
- actualWritten = __write(stream->hfile,
- ptr,
- towrite,
- &errind);
- if (errind)
- {
- stream->errorInd = 1;
- actualWritten = 0;
- errno = actualWritten;
- }
-#endif
- if (nmemb == 1)
- {
- if (actualWritten == size)
- {
- elemWritten = 1;
- }
- else
- {
- elemWritten = 0;
- }
- }
- else if (size == 1)
- {
- elemWritten = actualWritten;
- }
- else
- {
- elemWritten = actualWritten / size;
- }
- stream->bufStartR += actualWritten;
- return (elemWritten);
- }
-}
-
-static void fwriteSlow(const void *ptr,
- size_t size,
- size_t nmemb,
- FILE *stream,
- size_t towrite,
- size_t *elemWritten)
-{
- size_t actualWritten;
-
- /* Normally, on output, there will never be a situation where
- the write buffer is full, but it hasn't been written out.
- If we find this to be the case, then it is because we have
- done an fseek, and didn't know whether we were going to do
- a read or a write after it, so now that we know, we switch
- the buffer to being set up for write. We could use a flag,
- but I thought it would be better to just put some magic
- code in with a comment */
- if (stream->upto == stream->endbuf)
- {
- stream->bufStartR += (stream->endbuf - stream->fbuf);
- stream->upto = stream->fbuf;
- stream->mode = __WRITE_MODE;
- }
- if ((stream->textMode) || (stream->bufTech == _IOLBF))
- {
- fwriteSlowT(ptr, stream, towrite, &actualWritten);
- }
- else
- {
- fwriteSlowB(ptr, stream, towrite, &actualWritten);
- }
- if (nmemb == 1)
- {
- if (actualWritten == size)
- {
- *elemWritten = 1;
- }
- else
- {
- *elemWritten = 0;
- }
- }
- else if (size == 1)
- {
- *elemWritten = actualWritten;
- }
- else
- {
- *elemWritten = actualWritten / size;
- }
- return;
-}