size_t pdc_fwrite(const void *ptr, size_t size, size_t nmemb, pdc_file *sfp) { static const char fn[] = "pdc_fwrite"; if (sfp->wrmode) { size_t poslen, nbytes = 0; if (sfp->fp) return pdc__fwrite(ptr, size, nmemb, sfp->fp); nbytes = size * nmemb; if (sfp->pos + nbytes > sfp->limit) { poslen = (size_t) (sfp->pos - sfp->data); size = poslen + nbytes; sfp->data = (pdc_byte *) pdc_realloc(sfp->pdc, sfp->data, size, fn); sfp->pos = sfp->data + poslen; sfp->end = sfp->data + size; sfp->limit = sfp->end; } memcpy(sfp->pos, ptr, nbytes); sfp->pos += nbytes; if (sfp->pos > sfp->end) sfp->end = sfp->pos; } else { nmemb = 0; } return nmemb; }
/* Write function depending on pdc->asciifile. */ size_t pdc_fwrite_ascii(pdc_core *pdc, const char *str, size_t len, FILE *fp) { (void) pdc; len = pdc__fwrite(str, 1, len, fp); return len; }
size_t pdc_fwrite(const void *ptr, size_t size, size_t nmemb, pdc_file *sfp) { static const char fn[] = "pdc_fwrite"; if (sfp->wrmode) { size_t poslen, nbytes = 0; if (sfp->fp) { size_t total = pdc__fwrite(ptr, size, nmemb, sfp->fp); if (total < size * nmemb) { pdc_set_fwrite_errmsg(sfp->pdc, sfp->filename); PDC_RETHROW(sfp->pdc); } return total; } nbytes = size * nmemb; if (sfp->pos + nbytes > sfp->limit) { poslen = (size_t) (sfp->pos - sfp->data); size = poslen + nbytes; sfp->data = (pdc_byte *) pdc_realloc(sfp->pdc, sfp->data, size, fn); sfp->pos = sfp->data + poslen; sfp->end = sfp->data + size; sfp->limit = sfp->end; } memcpy(sfp->pos, ptr, nbytes); sfp->pos += nbytes; if (sfp->pos > sfp->end) sfp->end = sfp->pos; } else { nmemb = 0; } return nmemb; }
static size_t pdc_writeproc_file(pdc_output *out, void *data, size_t size) { return pdc__fwrite(data, 1, size, out->fp); }