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;
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;
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)) {
char *chunk = NULL;
size_t got = 0;
- while (got = phpstr_chunk_buffer(s, data, data_len, &chunk, chunk_len)) {
+ while ((got = phpstr_chunk_buffer(s, data, data_len, &chunk, chunk_len))) {
passthru(chunk, got TSRMLS_CC);
if (!chunk_len) {
/* we already got the last chunk,