summaryrefslogtreecommitdiff
path: root/support/dktools/dk3strmb.ctr
blob: 4bae0cd06c5237a3a9be9b470e2fc4852f1a6072 (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
%%	options

copyright owner	=	Dirk Krause
copyright year	=	2011-xxxx
license		=	bsd



%%	module

#include "dk3all.h"



$(trace-include)



/**	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 : */