1%%	options
2
3copyright owner	=	Dirk Krause
4copyright year	=	2015-xxxx
5SPDX-License-Identifier:	BSD-3-Clause
6
7
8
9%%	header
10
11/**	@file	dk4membf.h	Save buffer data to file.
12*/
13
14#ifndef	DK4CONF_H_INCLUDED
15#if DK4_BUILDING_DKTOOLS4
16#include "dk4conf.h"
17#else
18#include <dktools-4/dk4conf.h>
19#endif
20#endif
21
22#ifndef STDIO_H_INCLUDED
23#include <stdio.h>
24#define	STDIO_H_INCLUDED 1
25#endif
26
27#ifndef	DK4MEMBUF_H_INCLUDED
28#if DK4_BUILDING_DKTOOLS4
29#include <libdk4c/dk4membuf.h>
30#else
31#include <dktools-4/dk4membuf.h>
32#endif
33#endif
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/**	Save buffer contents to file.
40	@param	fipo	Output file.
41	@param	mbptr	Buffer containing data to write.
42	@param	erp	Error report, may be NULL.
43	@return	1 on success, 0 on error.
44
45	Error codes:
46	- DK4_E_INVALID_ARGUMENTS<br>
47	  if fipo or mbptr is NULL,
48	- DK4_E_WRITE_FAILED<br>
49	  if a write attempt to file failed.
50*/
51int
52dk4membuf_to_file(FILE *fipo, dk4_membuf_t const *mbptr, dk4_er_t *erp);
53
54#ifdef __cplusplus
55}
56#endif
57
58
59
60%%	module
61
62#include "dk4conf.h"
63#include <libdk4c/dk4membf.h>
64
65#if DK4_HAVE_ERRNO_H
66#ifndef ERRNO_H_INCLUDED
67#include <errno.h>
68#define	ERRNO_H_INCLUDED 1
69#endif
70#endif
71
72#if DK4_HAVE_ASSERT_H
73#ifndef	ASSERT_H_INCLUDED
74#include <assert.h>
75#define	ASSERT_H_INCLUDED 1
76#endif
77#endif
78
79
80int
81dk4membuf_to_file(FILE *fipo, dk4_membuf_t const *mbptr, dk4_er_t *erp)
82{
83  dk4_membuf_cell_t	*pc	= NULL;
84  dk4_membuf_cell_t	*pn	= NULL;
85  size_t		 wrb	= 0;
86  int			 back	= 0;
87
88#if	DK4_USE_ASSERT
89	assert(NULL != fipo);
90	assert(NULL != mbptr);
91#endif
92  if ((NULL != fipo) && (NULL != mbptr)) {
93    back = 1;
94    pc = mbptr->first;
95    while (NULL != pc) {
96      pn = pc->next;
97      if (0 < pc->used) {
98        errno = 0;
99        wrb = fwrite(pc->buf, 1, pc->used, fipo);
100	if (wrb != pc->used) {
101	  back = 0;
102	  dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno);
103	}
104      }
105      pc = pn;
106    }
107  } else {
108    dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
109  }
110  return back;
111}
112
113
114