summaryrefslogtreecommitdiff
path: root/support/dktools/dk3strmb.c
blob: abe9b4b8b8e12b90896977ebeff0d80639b6ff7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
Copyright (C) 2011-2020, Dirk Krause
SPDX-License-Identifier: BSD-3-Clause
*/

/*
	WARNING: This file was generated by the dkct program (see
	http://dktools.sourceforge.net/ for details).
	Changes you make here will be lost if dkct is run again!
	You should modify the original source and run dkct on it.
	Original source: dk3strmb.ctr
*/

/**	@file dk3strmb.c The dk3strmb module.
*/


#line 10 "dk3strmb.ctr"

#include "dk3all.h"






#line 16 "dk3strmb.ctr"



/**	Low-level stream function to deal with bzip2 compression.
	Closing the stream also closes the bzip2-file.
	@param	api	API structure.
*/
static
void
dk3stream_bz_fct(dk3_stream_api_t *api)
{
#if DK3_HAVE_BZLIB_H
  BZFILE *b = NULL;	/* Low level I/O object. */
  int res = 0;		/* Operation result. */
#endif
  api->suc = 0;
  (api->res).sz = 0;
  (api->res).ec = DK3_ERROR_NOT_SUPPORTED;
#if DK3_HAVE_BZLIB_H
  b = (BZFILE *)((api->arg).d);
  (api->res).ec = 0;
  switch(api->cmd) {
    case DK3_STREAM_API_READ: {
      if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) {
        res = BZ2_bzread(b, (api->arg).b, (int)((api->arg).sz));
	if(res > 0) {
	  api->suc = 1; (api->res).ec = 0; (api->res).sz = (size_t)res;
	}
      }
    } break;
    case DK3_STREAM_API_WRITE: {
      if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) {
        res = BZ2_bzwrite(b, (api->arg).b, (int)((api->arg).sz));
	if(res > 0) {
	  (api->res).sz = (size_t)res;
	  if((size_t)res == (api->arg).sz) {
	    api->suc = 1; (api->res).ec = 0;
	  }
	}
      }
    } break;
    case DK3_STREAM_API_FLUSH: {
      if((api->arg).d) {
        BZ2_bzflush(b);
	api->suc = 1; (api->res).ec = 0;
	/* 
		As the library manual explains BZ2_bzflush() does nothing.
		So we always return success.
	*/
      }
    } break;
    case DK3_STREAM_API_AT_END: {
      
    } break;
    case DK3_STREAM_API_CLOSE: {
      if((api->arg).d) {
        BZ2_bzclose(b);
	api->suc = 1; (api->res).ec = 0;
      }
    } break;
    case DK3_STREAM_API_ZERO_IS_END: {
      api->suc = 1; (api->res).ec = 0; /* Correct if necessary */
    } break;
    case DK3_STREAM_API_ERROR: {
    } break;
  }
#endif
}



/**	Low-level stream function to deal with bzip2 compression.
	Closing the stream does not close the bzip2 file.
	@param	api	API structure.
*/
static
void
dk3stream_bz_fct_no_close(dk3_stream_api_t *api)
{
  if(api->cmd != DK3_STREAM_API_CLOSE) {
    dk3stream_bz_fct(api);
  } else {
    api->suc = 1; (api->res).ec = 0;
  }
}



#if DK3_HAVE_BZLIB_H

/**	Open a stream for an existing BZFILE.
	@param	b	BZFILE already opened.
	@param	fl	Read/write flags.
	@param	app	Application structure for diagnostics, may be NULL.
	@return	Pointer to new stream on success, NULL on error.
*/
dk3_stream_t *
dk3stream_open_bz2_app(BZFILE *b, int fl, dk3_app_t *app)
{
  dk3_stream_t *back = NULL;
  if(b) {
    back = dk3stream_open_app((void *)b, dk3stream_bz_fct_no_close, fl, app);
  }
  return back;
}

#endif



/* vim: set ai sw=2 : */