projects
/
m6w6
/
ext-http
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
- release .24.1
[m6w6/ext-http]
/
phpstr
/
phpstr.c
diff --git
a/phpstr/phpstr.c
b/phpstr/phpstr.c
index 69f577f2da079cf1221db19c90188b215063f7e4..a312b1e773134dbe2ad558aeaaffaa78ff1ec38b 100644
(file)
--- a/
phpstr/phpstr.c
+++ b/
phpstr/phpstr.c
@@
-13,7
+13,7
@@
PHPSTR_API phpstr *phpstr_init_ex(phpstr *buf, size_t chunk_size, int flags)
}
if (buf) {
}
if (buf) {
- buf->size = (chunk_size
> 0
) ? chunk_size : PHPSTR_DEFAULT_SIZE;
+ buf->size = (chunk_size) ? chunk_size : PHPSTR_DEFAULT_SIZE;
buf->pmem = (flags & PHPSTR_INIT_PERSISTENT) ? 1 : 0;
buf->data = (flags & PHPSTR_INIT_PREALLOC) ? pemalloc(buf->size, buf->pmem) : NULL;
buf->free = (flags & PHPSTR_INIT_PREALLOC) ? buf->size : 0;
buf->pmem = (flags & PHPSTR_INIT_PERSISTENT) ? 1 : 0;
buf->data = (flags & PHPSTR_INIT_PREALLOC) ? pemalloc(buf->size, buf->pmem) : NULL;
buf->free = (flags & PHPSTR_INIT_PREALLOC) ? buf->size : 0;
@@
-25,7
+25,7
@@
PHPSTR_API phpstr *phpstr_init_ex(phpstr *buf, size_t chunk_size, int flags)
PHPSTR_API phpstr *phpstr_from_string_ex(phpstr *buf, const char *string, size_t length)
{
PHPSTR_API phpstr *phpstr_from_string_ex(phpstr *buf, const char *string, size_t length)
{
- if (
buf = phpstr_init(buf
)) {
+ if (
(buf = phpstr_init(buf)
)) {
if (NOMEM == phpstr_append(buf, string, length)) {
pefree(buf, buf->pmem);
buf = NULL;
if (NOMEM == phpstr_append(buf, string, length)) {
pefree(buf, buf->pmem);
buf = NULL;
@@
-36,6
+36,9
@@
PHPSTR_API phpstr *phpstr_from_string_ex(phpstr *buf, const char *string, size_t
PHPSTR_API size_t phpstr_resize_ex(phpstr *buf, size_t len, size_t override_size)
{
PHPSTR_API size_t phpstr_resize_ex(phpstr *buf, size_t len, size_t override_size)
{
+#if 0
+ fprintf(stderr, "RESIZE: size=%lu, used=%lu, free=%lu\n", buf->size, buf->used, buf->free);
+#endif
if (buf->free < len) {
size_t size = override_size ? override_size : buf->size;
if (buf->free < len) {
size_t size = override_size ? override_size : buf->size;
@@
-63,6
+66,22
@@
PHPSTR_API size_t phpstr_resize_ex(phpstr *buf, size_t len, size_t override_size
return 0;
}
return 0;
}
+PHPSTR_API size_t phpstr_shrink(phpstr *buf)
+{
+ /* avoid another realloc on fixation */
+ if (buf->free > 1) {
+ char *ptr = perealloc(buf->data, buf->used + 1, buf->pmem);
+
+ if (ptr) {
+ buf->data = ptr;
+ } else {
+ return NOMEM;
+ }
+ buf->free = 1;
+ }
+ return buf->used;
+}
+
PHPSTR_API size_t phpstr_append(phpstr *buf, const char *append, size_t append_len)
{
if (NOMEM == phpstr_resize(buf, append_len)) {
PHPSTR_API size_t phpstr_append(phpstr *buf, const char *append, size_t append_len)
{
if (NOMEM == phpstr_resize(buf, append_len)) {
@@
-221,22
+240,16
@@
PHPSTR_API phpstr *phpstr_right(const phpstr *buf, size_t length)
PHPSTR_API phpstr *phpstr_merge_va(phpstr *buf, unsigned argc, va_list argv)
{
PHPSTR_API phpstr *phpstr_merge_va(phpstr *buf, unsigned argc, va_list argv)
{
- unsigned
f = 0,
i = 0;
+ unsigned i = 0;
buf = phpstr_init(buf);
if (buf) {
while (argc > i++) {
phpstr_free_t f = va_arg(argv, phpstr_free_t);
phpstr *current = va_arg(argv, phpstr *);
buf = phpstr_init(buf);
if (buf) {
while (argc > i++) {
phpstr_free_t f = va_arg(argv, phpstr_free_t);
phpstr *current = va_arg(argv, phpstr *);
- if (NOMEM == phpstr_append(buf, current->data, current->used)) {
- f = 1;
- }
+ phpstr_append(buf, current->data, current->used);
FREE_PHPSTR(f, current);
}
FREE_PHPSTR(f, current);
}
-
- if (f) {
- phpstr_free(&buf);
- }
}
return buf;
}
return buf;
@@
-341,13
+354,13
@@
PHPSTR_API size_t phpstr_chunk_buffer(phpstr **s, const char *data, size_t data_
return 0;
}
return 0;
}
-PHPSTR_API void phpstr_chunked_output(phpstr **s, const char *data, size_t data_len, size_t chunk_len,
void (*passthru)(const char *, size_t TSRMLS_DC)
TSRMLS_DC)
+PHPSTR_API void phpstr_chunked_output(phpstr **s, const char *data, size_t data_len, size_t chunk_len,
phpstr_passthru_func passthru, void *opaque
TSRMLS_DC)
{
char *chunk = NULL;
size_t got = 0;
{
char *chunk = NULL;
size_t got = 0;
- while (
got = phpstr_chunk_buffer(s, data, data_len, &chunk, chunk_len
)) {
- passthru(chunk, got TSRMLS_CC);
+ while (
(got = phpstr_chunk_buffer(s, data, data_len, &chunk, chunk_len)
)) {
+ passthru(
opaque,
chunk, got TSRMLS_CC);
if (!chunk_len) {
/* we already got the last chunk,
and freed all resources */
if (!chunk_len) {
/* we already got the last chunk,
and freed all resources */