Skip to content

Commit 41aee5a

Browse files
committed
stream: break current streams API for cleaner design
1 parent aa898d9 commit 41aee5a

File tree

3 files changed

+21
-48
lines changed

3 files changed

+21
-48
lines changed

main/streams/filter.c

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ PHPAPI void php_stream_bucket_unlink(php_stream_bucket *bucket)
216216
* match. If that fails, we try "convert.charset.*", then "convert.*"
217217
* This means that we don't need to clog up the hashtable with a zillion
218218
* charsets (for example) but still be able to provide them all as filters */
219-
PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, uint8_t persistent)
219+
PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, bool persistent)
220220
{
221221
HashTable *filter_hash = (FG(stream_filters) ? FG(stream_filters) : &stream_filters_hash);
222222
const php_stream_filter_factory *factory = NULL;
@@ -260,37 +260,22 @@ PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval
260260
return filter;
261261
}
262262

263-
PHPAPI php_stream_filter *_php_stream_filter_alloc_ex(const php_stream_filter_ops *fops,
264-
const php_stream_filter_extra_ops *feops, void *abstract, uint8_t persistent, uint16_t flags STREAMS_DC)
263+
PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops,
264+
void *abstract, bool persistent, uint32_t flags STREAMS_DC)
265265
{
266266
php_stream_filter *filter;
267267

268268
filter = (php_stream_filter*) pemalloc_rel_orig(sizeof(php_stream_filter), persistent);
269269
memset(filter, 0, sizeof(php_stream_filter));
270270

271271
filter->fops = fops;
272-
filter->feops = feops;
273272
filter->seekable = flags & PHP_STREAM_FILTER_SEEKABLE_MASK;
274273
Z_PTR(filter->abstract) = abstract;
275274
filter->is_persistent = persistent;
276275

277276
return filter;
278277
}
279278

280-
PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, void *abstract, uint8_t persistent STREAMS_DC)
281-
{
282-
php_stream_filter *filter;
283-
284-
filter = (php_stream_filter*) pemalloc_rel_orig(sizeof(php_stream_filter), persistent);
285-
memset(filter, 0, sizeof(php_stream_filter));
286-
287-
filter->fops = fops;
288-
Z_PTR(filter->abstract) = abstract;
289-
filter->is_persistent = persistent;
290-
291-
return filter;
292-
}
293-
294279
PHPAPI void php_stream_filter_free(php_stream_filter *filter)
295280
{
296281
if (filter->fops->dtor)

main/streams/php_stream_filter_api.h

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636

3737
#define PHP_STREAM_FILTER_SEEKABLE_NEVER 0
3838
#define PHP_STREAM_FILTER_SEEKABLE_START 1
39-
#define PHP_STREAM_FILTER_SEEKABLE_ALWAYS 2
39+
#define PHP_STREAM_FILTER_SEEKABLE_CHECK 2
40+
#define PHP_STREAM_FILTER_SEEKABLE_ALWAYS 3
4041
#define PHP_STREAM_FILTER_SEEKABLE_MASK 3
4142

4243
typedef struct _php_stream_bucket php_stream_bucket;
@@ -93,31 +94,18 @@ typedef struct _php_stream_filter_ops {
9394
int flags
9495
);
9596

96-
void (*dtor)(php_stream_filter *thisfilter);
97-
98-
const char *label;
99-
100-
} php_stream_filter_ops;
101-
102-
typedef struct _php_stream_filter_extra_ops {
103-
/* it should indicate whether seeking is supported and possibly modify internal state */
10497
zend_result (*seek)(
10598
php_stream *stream,
10699
php_stream_filter *thisfilter,
107100
zend_off_t offset,
108101
int whence
109102
);
110103

111-
/* this is a generic interface for possible further extensions */
112-
zend_result (*set_option)(
113-
php_stream *stream,
114-
php_stream_filter *thisfilter,
115-
int option,
116-
void *value,
117-
size_t size
118-
);
104+
void (*dtor)(php_stream_filter *thisfilter);
119105

120-
} php_stream_filter_extra_ops;
106+
const char *label;
107+
108+
} php_stream_filter_ops;
121109

122110
typedef struct _php_stream_filter_chain {
123111
php_stream_filter *head, *tail;
@@ -128,7 +116,6 @@ typedef struct _php_stream_filter_chain {
128116

129117
struct _php_stream_filter {
130118
const php_stream_filter_ops *fops;
131-
const php_stream_filter_extra_ops *feops;
132119
zval abstract; /* for use by filter implementation */
133120
php_stream_filter *next;
134121
php_stream_filter *prev;
@@ -154,27 +141,27 @@ PHPAPI zend_result php_stream_filter_append_ex(php_stream_filter_chain *chain, p
154141
PHPAPI zend_result _php_stream_filter_flush(php_stream_filter *filter, bool finish);
155142
PHPAPI php_stream_filter *php_stream_filter_remove(php_stream_filter *filter, bool call_dtor);
156143
PHPAPI void php_stream_filter_free(php_stream_filter *filter);
157-
PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, void *abstract, uint8_t persistent STREAMS_DC);
158-
PHPAPI php_stream_filter *_php_stream_filter_alloc_ex(const php_stream_filter_ops *fops,
159-
const php_stream_filter_extra_ops *feops, void *abstract, uint8_t persistent, uint16_t flags STREAMS_DC);
144+
PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops,
145+
void *abstract, bool persistent, uint32_t flags STREAMS_DC);
146+
160147
END_EXTERN_C()
161-
#define php_stream_filter_alloc(fops, thisptr, persistent) _php_stream_filter_alloc((fops), (thisptr), (persistent) STREAMS_CC)
162-
#define php_stream_filter_alloc_ex(fops, feops, thisptr, persistent) \
163-
_php_stream_filter_alloc_ex((fops), (feops), (thisptr), (persistent) STREAMS_CC)
164-
#define php_stream_filter_alloc_rel(fops, thisptr, persistent) _php_stream_filter_alloc((fops), (thisptr), (persistent) STREAMS_REL_CC)
148+
#define php_stream_filter_alloc(fops, thisptr, persistent, flags) \
149+
_php_stream_filter_alloc((fops), (thisptr), (persistent), (flags) STREAMS_CC)
150+
#define php_stream_filter_alloc_rel(fops, thisptr, persistent, flags) \
151+
_php_stream_filter_alloc((fops), (thisptr), (persistent), (flags) STREAMS_REL_CC)
165152
#define php_stream_filter_prepend(chain, filter) _php_stream_filter_prepend((chain), (filter))
166153
#define php_stream_filter_append(chain, filter) _php_stream_filter_append((chain), (filter))
167154
#define php_stream_filter_flush(filter, finish) _php_stream_filter_flush((filter), (finish))
168155

169156
#define php_stream_is_filtered(stream) ((stream)->readfilters.head || (stream)->writefilters.head)
170157

171158
typedef struct _php_stream_filter_factory {
172-
php_stream_filter *(*create_filter)(const char *filtername, zval *filterparams, uint8_t persistent);
159+
php_stream_filter *(*create_filter)(const char *filtername, zval *filterparams, bool persistent);
173160
} php_stream_filter_factory;
174161

175162
BEGIN_EXTERN_C()
176163
PHPAPI zend_result php_stream_filter_register_factory(const char *filterpattern, const php_stream_filter_factory *factory);
177164
PHPAPI zend_result php_stream_filter_unregister_factory(const char *filterpattern);
178165
PHPAPI zend_result php_stream_filter_register_factory_volatile(zend_string *filterpattern, const php_stream_filter_factory *factory);
179-
PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, uint8_t persistent);
166+
PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, bool persistent);
180167
END_EXTERN_C()

main/streams/streams.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,8 +1377,9 @@ static bool php_stream_are_filters_seekable(php_stream_filter *filter, bool is_s
13771377
static zend_result php_stream_filters_seek(php_stream *stream, php_stream_filter *filter, bool is_start_seeking)
13781378
{
13791379
while (filter) {
1380-
if ((filter->seekable == PHP_STREAM_FILTER_SEEKABLE_START && is_start_seeking &&
1381-
filter->feops->seek(stream, filter, 0, SEEK_SET))) {
1380+
if (((filter->seekable == PHP_STREAM_FILTER_SEEKABLE_START && is_start_seeking) ||
1381+
filter->seekable == PHP_STREAM_FILTER_SEEKABLE_CHECK) &&
1382+
filter->fops->seek(stream, filter, 0, SEEK_SET)) {
13821383
php_error_docref(NULL, E_WARNING, "Stream filter seeking for %s failed", filter->fops->label);
13831384
return FAILURE;
13841385
}

0 commit comments

Comments
 (0)